Страница 1 из 1

Timestamp

СообщениеДобавлено: 14.11.2014 17:19:18
Sharfik
Никак не пойму, результат функции DateToUnix() является значением Timestamp, т.е. регионо независимым или нет? Unix время при расчете начинается от 1970 года вроде, но оно как привязано к региону?

Re: Timestamp

СообщениеДобавлено: 14.11.2014 22:24:59
*Rik*
Это значение вычисляется из текущих показаний часов вашего компьютера. Результатом функции DateTimeToUnix - будет целочисленное значение содержащее количество секунд прошедшее с полуночи (00:00:00 UTC) 1 января 1970 года (четверг); время с этого момента называют «эрой UNIX». В любом случае все расчеты основываются на показаниях часов вашего компьютера и возвращаемое значение - один из возможных вариантов хранения даты-времени в виде целочисленного значения.

Re: Timestamp

СообщениеДобавлено: 15.11.2014 05:33:05
SSerge
Sharfik
Коллега, вам это попадалось на глаза: viewtopic.php?f=1&t=10027 ?

А по сути - следующее.

DateToUnix напрямую из локального времени не имеет смысла вообще. Потому что "................Результатом функции DateTimeToUnix - будет целочисленное значение содержащее количество секунд прошедшее с полуночи (00:00:00 UTC) 1 января 1970 года" - а подставляется дата НЕ В UTC. Результат будет смещен на величину смещения временной зоны на текущий момент. Различные UNIXы свой TimeStamp клепают только по времени UTC. Чтобы сработало правильно, нужно следующую конструкцию: DateTimeToUnix(LocalTimeToUniversal(date_now))

... и вот здесь следует учитывать, что все это в сущности верно только для промежутка времени с момент последнего изменения временных зон локали до текущего момента Функция LocalTimeToUniversal ничего не знает о переводах стрелок в прошлом и будущем, об изменениях временных поясов для зоны и т.п. - т.е. для работы с датой в произвольном периоде - непригодна абсолютно.

Добавлено спустя 13 минут 47 секунд:
p/s Заодно стоит задуматься над тем, что различные вычисления количества секунд, минут, часов а иногда дней между двумя датами TDateTime, располагающимися в моменты разных смещений относительно UTC, с помощью функций RTL freepascal (а возможно и Delphi), дадут неверный результат

Добавлено спустя 24 минуты 6 секунд:
Вот еще повод для размышлений о соответствиях времен.

26 октября в 2:00 стрелки переводятся на час назад. То есть внезапно после 2014-10-26 01:59:59 наступает 2014-10-26 01:00:00
Контрольный выстрел в голову: в какой unix timestamp должно быть преобразовано время 2014-10-26 01:30:00 на момент запуска программы в 2014-12-01 00:00:00 :mrgreen:

Re: Timestamp

СообщениеДобавлено: 15.11.2014 10:58:46
Vapaamies
SSerge писал(а):в какой unix timestamp должно быть преобразовано время 2014-10-26 01:30:00 на момент запуска программы в 2014-12-01 00:00:00 :mrgreen:

Об этом наверняка в стандартах ISO об исчислении времени написано.

Re: Timestamp

СообщениеДобавлено: 15.11.2014 12:33:01
SSerge
Vapaamies писал(а):Об этом наверняка в стандартах ISO об исчислении времени написано.


Несмотря на то, что там написано, мы имеем два различных момента времени, выражаемых одинаковой записью без какой либо возможности их различить. Вот почему перевод UTC в местное время и обратно - процедура действительная только на момент этого перевода, и время перевода - только текущее и никак иначе. :mrgreen: А иначе - сюрпризы различные.

Так что, правильный unux timestamp - метка действительно уникальная и не повторяющаяся, а TDateTime в любых ее проявлениях - корректна только с большими оговорками на период действия, на зону применения, информации о которой в ней нет и ... на манипуляции с поясным временем, включая различные летние и зимние времена.

Re: Timestamp

СообщениеДобавлено: 15.11.2014 14:57:32
Sharfik
Чем дальше в лес, тем толще партизаны(((
Спасибо всем.
Где то можно найти информацию о всех корректировках времени, чтобы свои функции написать, нет?

Re: Timestamp

СообщениеДобавлено: 15.11.2014 16:23:41
SSerge
Sharfik писал(а):Где то можно найти информацию о всех корректировках времени, чтобы свои функции написать, нет?


Абсолютный первоисточник:

http://www.iana.org/time-zones

В скомпилированном виде эта же информация есть в любом линуксе, для действующей зоны это файлик /etc/localtime - т.е. стандартные функции работы со временем линукса знают о всех переводах стрелок