Как лучше хранить дату и время?

3. ProIT 14.09.11 06:15 Сейчас в теме
Смотря какая задача стоит, можно в строку склеить потом расклеивать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. varkolak 4 14.09.11 11:40 Сейчас в теме
А почему бы не хранить в стандартных форматах?
5. vcv 89 14.09.11 12:00 Сейчас в теме
(4) А какой в 7.7 стандартный формат даты/времени?
6. Noy 1076 14.09.11 12:40 Сейчас в теме
Пример:
ВыбДата=Дата(2011,08,31);
ВыбВремя="12:00:01";


//Функция приеобразует время из строки в число и наоборот
Функция глВремя(Время,ЧЧ="00",ММ="00",СС="00") Экспорт
Если ТипЗначенияСтр(Время)="Число" Тогда
Если Время=0 Тогда Возврат " : : "; КонецЕсли;
Время=Мин(Время,86400); Если Время=86400 Тогда Время=0; КонецЕсли;
чЧЧ=Цел(Время/(60*60));
чММ=Цел((Время-(чЧЧ*60*60))/60);
чСС=Время-((чЧЧ*60*60)+чММ*60);
ЧЧ=Формат(чЧЧ,"Ч(0)2.0");
ММ=Формат(чММ,"Ч(0)2.0");
СС=Формат(чСС,"Ч(0)2.0");
Возврат ""+ЧЧ+":"+ММ+":"+СС;
ИначеЕсли ТипЗначенияСтр(Время)="Строка" Тогда
Если СтрДлина(Время)=5 Тогда Время=Время+":00"; КонецЕсли;
Время=СтрЗаменить(Время,":",РазделительСтрок);
чЧЧ=Число(СтрПолучитьСтроку(Время,1));
чММ=Число(СтрПолучитьСтроку(Время,2));
чСС=Число(СтрПолучитьСтроку(Время,3));
Возврат Число(чЧЧ*60*60+чММ*60+чСС);
КонецЕсли;

КонецФункции

ДатаДляХранения=ВыбДата-Дата(1899,12,31);
ВремяДляХранения=глВремя(ВыбВремя);
МоментДляХранения=Число(""+ДатаДляХранения+"."+ВремяДляХранения);

Получим число с точностью до 5-ти знаков.
Подлежит сортировке, операциям сравнения и тп
7. varkolak 4 14.09.11 12:49 Сейчас в теме
Да, наверное лучше всего хронить текстом.
8. Antony_79 15.09.11 16:33 Сейчас в теме
(1)например, для записанного дока можна использовать его позицию
9. z5515 5 16.09.11 15:18 Сейчас в теме
использую количество секунд с 1900 года, значительно интересней стандарта получается, еще как вариант, создавать служебный документ, без реквизитов.
10. Korben Dallas 23.09.11 11:05 Сейчас в теме
Чаще всего используется так называемое UNIX-время, число секунд с 1 января 1970 года - http://ru.wikipedia.org/wiki/UNIX-время.
Перевод в обычный формат (число, месяц, день, часы, минуты, секунды в отдельных переменных) и обратно для 7.7 - http://www.1cpp.ru/forum/YaBB.pl?num=1202890228
Для 8:
Дата -> unixtime
Сообщить(Формат(ТекущаяДата() - Дата(1970,1,1,1,0,0), "ЧГ=0"));
unixtime -> Дата
Сообщить(Дата(1970,1,1,1,0,0) + 1311790933);
11. KotMurza 25.09.11 23:20 Сейчас в теме
//--------------------------------
// работа с временем
//

Функция РазобратьВремя(Знач СтрВремя, Час=0, Минуты=0, Сек=0) Экспорт
Час =Число(Сред(СтрВремя,1,2));
Минуты =Число(Сред(СтрВремя,4,2));
Сек =Число(Сред(СтрВремя,7,2));

Возврат СтрВремя;
КонецФункции


Функция РазобратьВремяЗаписиФайла(Знач СтрВремя, ДатаЗаписи=0, Час=0, Минуты=0, Сек=0) Экспорт
СтрДата =Лев(СтрВремя,10);
СтрДата =Прав(СтрДата,2)+"."+Сред(СтрДата,6,2)+"."+Лев(СтрДата,4);
ДатаЗаписи =Дата(СтрДата);
ВремяЗаписи =СокрЛП(Сред(СтрВремя,12));
РазобратьВремя(ВремяЗаписи, Час, Минуты, Сек);
Возврат СтрДата+" "+ВремяЗаписи;
КонецФункции


Функция ВремяЗаписиФайла2АбсВремя(Знач СтрВремя) Экспорт
Перем ДатаЗаписи, Час, Минуты, Сек;

РазобратьВремяЗаписиФайла(СтрВремя, ДатаЗаписи, Час, Минуты, Сек);
Возврат АбсВремя(ДатаЗаписи, Час, Минуты, Сек);
КонецФункции


Функция ПолучитьВремяСтрокой(Знач Час=0, Знач Минуты=0, Знач Сек=0) Экспорт
Возврат Формат(Час, "Ч(0)2.0")+":"+Формат(Минуты, "Ч(0)2.0")+":"+Формат(Сек, "Ч(0)2.0");
КонецФункции


Функция ПрибавитьСекунды(Знач СтрВремя="", ПрибавитьСекунд=0, Час=0, Минуты=0, Сек=0) Экспорт
Перем Секунд;
Если СтрВремя="" Тогда СтрВремя=ТекущееВремя(); Конецесли;
Возврат Сек2Время(Время2Сек(СтрВремя)+ПрибавитьСекунд, Час, Минуты, Сек);
КонецФункции


Функция ПроверитьВремя(СтрВремя) Экспорт
СтрВремя=СтрЗаменить(СтрВремя," ","0");
Ч=0; М=0; С=0;
РазобратьВремя(СтрВремя, Ч,М,С);
Если Ч>23 тогда Ч=0; КонецЕсли;
Если М>59 тогда М=0; КонецЕсли;
Если С>59 тогда С=0; КонецЕсли;
СтрВремя=ПолучитьВремяСтрокой(Ч, М, С);

Возврат СтрВремя;
КонецФункции


Функция АбсВремя(Знач ТекДата=0, Знач Час=0, Знач Минуты=0, Знач Сек=0) Экспорт
Если ТипЗначенияСтр(Час)="Строка" тогда РазобратьВремя(Час, Час, Минуты, Сек); Конецесли;
Если ТекДата=0 Тогда
ТекДата=ТекущаяДата();
ТекущееВремя(Час, Минуты, Сек);
КонецЕсли;
Годов =ДатаГод(ТекДата)-1;
Высокосных =Цел(Годов/4);
Возврат Годов*31536000+(Высокосных+НомерДняГода(ТекДата))*86400+Час*3600+Минуты*60+Сек;
КонецФункции


Функция АбсВремяРасшифровка(Знач АбсВремя, ТекДата=0, Час=0, Минуты=0, Сек=0) Экспорт

Дней =Цел(АбсВремя/86400);
Время =АбсВремя-Дней*86400;
Час =Цел(Время/3600);
Минуты =Цел((Время-Час*3600)/60);
Сек =Время-Час*3600-Минуты*60;

Квадр =Цел(Дней/1461);
ОстатокДней =Дней%1461;
Годов =Квадр*4+?(ОстатокДней>=1095,3,Цел(ОстатокДней/365));
Дней =?(ОстатокДней>=1095,ОстатокДней-1095, ОстатокДней%365);

ТекДата =Дата("01.01."+(Годов+1))+Дней-1;

Возврат Строка(ТекДата)+" "+ПолучитьВремяСтрокой(Час, Минуты, Сек);
КонецФункции


Функция Секунд(Знач Час, Знач Минуты, Знач Сек) Экспорт
Возврат Час*3600+Минуты*60+Сек;
КонецФункции


Функция Время2Сек(Знач СтрВремя="") Экспорт
Если СтрВремя="" Тогда СтрВремя=ТекущееВремя(); КонецЕсли;
Возврат (Число(Сред(СтрВремя,1,2))*3600)+(Число(Сред(СтрВремя,4,2))*60)+Число(Сред(СтрВремя,7,2));
КонецФункции


Функция Сек2Время(Секунд=0, Час=0, Минуты=0, Сек=0) Экспорт
Час =Цел(Секунд/3600);
Минуты =Цел((Секунд-Час*3600)/60);
Сек =Секунд-Час*3600-Минуты*60;
Если Час>23 Тогда
Час=Час%24;
КонецЕсли;

Возврат ПолучитьВремяСтрокой(Час, Минуты, Сек);
КонецФункции


Функция Дата_Время(ТекДата=0, ТекВремя=0) Экспорт
Если ТекДата=0 Тогда ТекДата=ТекущаяДата(); Конецесли;
Если ТекВремя=0 Тогда ТекВремя=ТекущееВремя(); КонецЕсли;

Возврат Формат(ТекДата, "ДДДММГГГГ")+" "+ТекВремя;
КонецФункции


Функция Дата_Время2АбсВремя(ДатаВремя) Экспорт
ДатаВремя=СокрЛП(ДатаВремя);
Поз=Найти(ДатаВремя," ");
Если (Поз=9) или (Поз=11) тогда
Д=Дата(Лев(ДатаВремя,Поз-1));
Ч=0;М=0;С=0;
РазобратьВремя(Сред(ДатаВремя,Поз+1), Ч, М, С);
Возврат АбсВремя(Д, Ч, М, С);
КонецЕсли;
Возврат 0;
КонецФункции


Функция АбсВремя2Дата_Время(АбсВремя, ТекДата=0, Час=0, Минуты=0, Сек=0) Экспорт
АбсВремяРасшифровка(АбсВремя, ТекДата, Час, Минуты, Сек);
Возврат Дата_Время(ТекДата, ПолучитьВремяСтрокой(Час, Минуты, Сек));
КонецФункции


Функция СекундВСутках() Экспорт Возврат 24*3600; КонецФункции


Функция __Дней(Дней)
Если Дней=0 Тогда Возврат "дней";
ИначеЕсли Дней=1 Тогда Возврат "день";
ИначеЕсли Дней<5 Тогда Возврат "дня";
Иначе Возврат "дней";
КонецЕсли;
КонецФункции


Функция ДнейПрописью(Знач Дней, Знач Доп="") Экспорт
Возврат Строка(Дней)+" "+?(ПустоеЗначение(Доп)=1,"",СокрЛП(Доп)+" ")+?(Дней<21,__Дней(Дней),__Дней(Число(Прав(строка(Дней),1))));
КонецФункции


Функция ДатаПрописью(Знач ТекДата) Экспорт
Перем ДатаДокПрописью, ЧислоМесяца, МесяцСтр;

Если ТипЗначения(ТекДата)="Строка" Тогда ТекДата=Дата(ТекДата); КонецЕсли;
ДатаДокПрописью="";
ЧислоМесяца=ДатаЧисло(ТекДата);
Если ТипЗначенияСтр(ЧислоМесяца)<>"Число" Тогда ЧислоМесяца=0; КонецЕсли;
Если ЧислоМесяца=0 Тогда Возврат ""; КонецЕсли;

ДатаДокПрописью=?(ЧислоМесяца>30,"Тридцять ",?(ЧислоМесяца=30, "Тридцяте ",?(ЧислоМесяца>20, "Двадцять ",СБольшойБуквы(ДД[ЧислоМесяца]))));
Если (ЧислоМесяца>20) и (ЧислоМесяца<>30) Тогда
аа=число(прав(СокрЛП(Строка(ЧислоМесяца)),1));
ДатаДокПрописью=ДатаДокПрописью+" "+ДД[аа];
КонецЕсли;

Возврат ДатаДокПрописью+" "+ММ[ДатаМесяц(ТекДата)]+" "+ДатаГод(ТекДата)+" року.";
КонецФункции


Функция ДатаКвартал(ДатаНач=0) Экспорт
Если ДатаНач=0 тогда ДатаНач=текущаяДата(); КонецЕсли;

Возврат 1+Цел((ДатаМесяц(ДатаНач)-1)/3);
КонецФункции
12. vagipov 64 26.09.11 10:58 Сейчас в теме
Я храню дату в виде текстовой строки
ГГГГ_ММ_ДД_ЧЧ_ММ_СС

Соответственно есть процедуры для преобразования и туда и обратно

Причина хранения в таком виде - единовременное удобство сортировки и удобство визуального отображения
17. DenLaDen 10.10.11 07:21 Сейчас в теме
(12) +1
Например автор ветку создал 19.03.06 0:16
Тогда эту дату можно хранить в числе: Число( "" + 2006 + 03 + 19 + 00 + 16 ) = 200'603'190'016
У предыдущего постера дата получается 201'110'091'827
(13) см (12) в таком виде удобнее сравнивать моменты времени с точностью до секунд
18. madvovik 31 10.10.11 08:54 Сейчас в теме
(17)а если нужно произвести с реквизитом операцию сравнения?
19. DenLaDen 10.10.11 09:15 Сейчас в теме
(18) приводите к одному типу да сравнивайте :)
20. madvovik 31 10.10.11 10:07 Сейчас в теме
(19)самый простой пример сравните две даты 10.01.11 12:01:02 и 12.01.11 10:04:09, укажите разницу в днях часах минутах секундах? Ваш код?
22. vagipov 64 10.10.11 16:42 Сейчас в теме
(20) madvovik,
Извини что не на твоих данных тестил просто
Вот твои

212161420800
212161593600
Дней 1
Часов 22
Минут 3
Секунд 7
13. ArCtic 3 28.09.11 13:38 Сейчас в теме
господа! что-то не пойму зачем так заморачиваться то? есть же стандарт хранения даты и времени, для чего придумывать новые велосипедики??? или вам заказчики такую фигню запросили, и вообще где это потом используется и в чем отличие от стандартного 1С формата???
14. madvovik 31 09.10.11 17:06 Сейчас в теме
(13)сам читаю эти грабли не пойму нифига придумывали тип "дата"
15. vcv 89 09.10.11 17:51 Сейчас в теме
(14) в типе "Дата" в 7.7 только дата, а вопрс стоит еще и во времени.
16. madvovik 31 09.10.11 18:27 Сейчас в теме
Пардон, не вник, тогда проще передавать в виде ддммгггг+(час*3600+мин*60+сек) получаемое значение типа число, расшифровка делается простейшей функцией преобразования числа в дату первые 8, далее идет время имхо это проще всего описанного выше, т.е. Имеем одну функцию перевода даты и времени в число, вторая обратно, каждая имеет одну и две строки соответственно
21. vagipov 64 10.10.11 16:40 Сейчас в теме
Если разницу в днях часах и минутах - то достаточно легко

Функция ДатаВЧисло(ГГГГ_МС_ДД_ЧЧ_ММ_СС)
ДВ = ГГГГ_МС_ДД_ЧЧ_ММ_СС;
ГГГГ = Число(Лев(ДВ,4));
МС = Число(Сред(ДВ,6,2));
ДД = Число(Сред(ДВ,9,2));
ЧЧ = Число(Сред(ДВ,12,2));
ММ = Число(Сред(ДВ,15,2));
СС = Число(Прав(ДВ,2));
ЧДата = Число(Дата(ГГГГ,МС,ДД))*24*60*60;
Сообщить(ЧДата);
ЧВремя = ЧЧ * 60 * 60 + ММ * 60 + СС;
ЧислоДВ = Чдата + ЧВремя;
Возврат(ЧислоДВ);
КонецФункции

Процедура МеждуДвумяДатами()
ДВ1 = "2011_06_07_12_14_07";
ДВ2 = "2011_06_08_12_03_01";

Дата1 = ДатаВЧисло(ДВ1);
Дата2 = ДатаВЧисло(ДВ2);
РазницаМеждуДВ = Дата1-Дата2;
Если РазницаМеждуДВ<0 Тогда
РазницаМеждуДВ = -РазницаМеждуДВ;
КонецЕсли;
КоличествоДней = Цел(РазницаМеждуДВ/24/60/60);
ОстатокОтДатыПослеВычетаДней = РазницаМеждуДВ - КоличествоДней*24*60*60;
КоличествоЧасов = Цел(ОстатокОтДатыПослеВычетаДней/60/60);
ОстатокОтДатыПослеВычетаЧасов = ОстатокОтДатыПослеВычетаДней - КоличествоЧасов*60*60;
КоличествоМинут = Цел(ОстатокОтДатыПослеВычетаЧасов/60);
КоличествоСекунд = ОстатокОтДатыПослеВычетаЧасов%60;
Сообщить("Дней " + КоличествоДней);
Сообщить("Часов " + КоличествоЧасов);
Сообщить("Минут " + КоличествоМинут);
Сообщить("Секунд " + КоличествоСекунд);
КонецПроцедуры


А вот если в месяцах то уже проблематичнее
23. vagipov 64 10.10.11 16:47 Сейчас в теме
Даты и времена соответственно
ДВ1 = "2011_01_10_12_01_02";
ДВ2 = "2011_01_12_10_04_09";
Ну и понятно что 24*60*60 и 60*60 это для наглядности а так это цифры 86400 и 3600
24. jklreg 10.10.11 17:29 Сейчас в теме
(23) vagipov, лучше без подчеркивания. И так понятно, в какой позиции что стоит...
25. ibazh 12.10.11 15:00 Сейчас в теме
канонический формат...лучшее пока не придумали )
26. warenic 109 12.10.11 16:52 Сейчас в теме
(25) ibazh
ibazh пишет:
канонический формат...лучшее пока не придумали )
,
Ну, спецЫ из фирмы Моторола изначально (где-то в 80 году) внедрили формат ДДММГГ (в микросхеме реал-тайм клок), а потом в 1999-м весь мир с содроганием ждал нового года...
27. 19.03.06 00:16 Сейчас в теме
Как лучше хранить дату и время?
28. 19.03.06 00:18 Сейчас в теме
ХроноКод – это число, однозначно определяющее позицию на оси времени, вычисляется как, количество секунд с Рождества Христова, таким образом, в любой момент времени мы можем получить уникальное число.
//***************************************************
//возвращает строку в формате времени "00:00:00"
Функция глФорматВремя(ЧасХ=0,МинХ=0,СекХ=0) Экспорт
Возврат Формат(ЧасХ,"Ч(0)2")+":"+Формат(МинХ,"Ч(0)2")+":"+Формат(СекХ,"Ч(0)2");
КонецФункции
//***************************************************
// По сроке формата времени возвращает
Процедура глВремяФормат(ВремяХ,ЧасХ,МинХ,СекХ) Экспорт
ЧасХ=Число(Лев(ВремяХ,2));
МинХ=Число(Сред(ВремяХ,4,2));
СекХ=Число(Прав(ВремяХ,2));
КонецПроцедуры
//***************************************************
// формирует хроно код на оси времени
Функция глХроноПозиция(ДатаХ,ВремяХ) Экспорт
Перем ЧасХ,МинХ,СекХ;
_ДатаХ=Число(ДатаХ);
глВремяФормат(ВремяХ,ЧасХ,МинХ,СекХ);
Возврат _ДатаХ*86400+ЧасХ*3600+МинХ*60+СекХ;
КонецФункции
//***************************************************
// преобраззует хроно код в дату и время
Функция глПозицияХроно(Знач ПозицияХ,ДатаХ=0,ВремяХ="00:00:00") Экспорт
_ДатаХ=Цел(ПозицияХ/86400);
ПозицияХ=ПозицияХ-(_ДатаХ*86400);
ЧасХ=Цел(ПозицияХ/3600);
ПозицияХ=ПозицияХ-(ЧасХ*3600);
МинХ=Цел(ПозицияХ/60);
ПозицияХ=ПозицияХ-(МинХ*60);
СекХ=ПозицияХ;
ДатаХ = Дата(_ДатаХ);
ВремяХ = глФорматВремя(ЧасХ,МинХ,СекХ);
Если ПустоеЗначение(ДатаХ)=1 Тогда
Возврат ВремяХ;
Иначе
Возврат ""+ДатаХ+"; "+ВремяХ;
КонецЕсли;
КонецФункции
nasta_2004; +1 Ответить
29. user1416843 20.12.21 09:37 Сейчас в теме
Внимание! Не забывайте отмечать решение на ваш вопрос, если оно найдено. Это повысит ваш рейтинг на форуме.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот