Аналог difftime
Модератор: Модераторы
-
tuzik87@inbox.ru
Аналог difftime
Есть ли во Free Pascal RTL аналог Сишной функции difftime?
dateutils
{ ---------------------------------------------------------------------
Period functions.
---------------------------------------------------------------------}
Function YearsBetween(const ANow, AThen: TDateTime): Integer;
Function MonthsBetween(const ANow, AThen: TDateTime): Integer;
Function WeeksBetween(const ANow, AThen: TDateTime): Integer;
Function DaysBetween(const ANow, AThen: TDateTime): Integer;
Function HoursBetween(const ANow, AThen: TDateTime): Int64;
Function MinutesBetween(const ANow, AThen: TDateTime): Int64;
Function SecondsBetween(const ANow, AThen: TDateTime): Int64;
Function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;
{ ---------------------------------------------------------------------
Period functions.
---------------------------------------------------------------------}
Function YearsBetween(const ANow, AThen: TDateTime): Integer;
Function MonthsBetween(const ANow, AThen: TDateTime): Integer;
Function WeeksBetween(const ANow, AThen: TDateTime): Integer;
Function DaysBetween(const ANow, AThen: TDateTime): Integer;
Function HoursBetween(const ANow, AThen: TDateTime): Int64;
Function MinutesBetween(const ANow, AThen: TDateTime): Int64;
Function SecondsBetween(const ANow, AThen: TDateTime): Int64;
Function MilliSecondsBetween(const ANow, AThen: TDateTime): Int64;
tuzik87@inbox.ru
С одним "но". Система представления дат в FPC совершенно не учитывает временные зоны, летнее время и прочее. И потому SecondsBetween(const ANow, AThen: TDateTime) может дать неправильный результат и, соответственно, результат, отличающийся от difftime();
TDateTime - "мемориальное" абстрактное время, непригодное для отметок времени по сути.
time_t - unix timestamp, всегда в UTC. Правильное представление.
С одним "но". Система представления дат в FPC совершенно не учитывает временные зоны, летнее время и прочее. И потому SecondsBetween(const ANow, AThen: TDateTime) может дать неправильный результат и, соответственно, результат, отличающийся от difftime();
TDateTime - "мемориальное" абстрактное время, непригодное для отметок времени по сути.
time_t - unix timestamp, всегда в UTC. Правильное представление.
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
tuzik87@inbox.ru
С учетом того, что написал SSerge, если это для вас существенно, то есть пакет PascalTZ - "Pascal Time Zone". Правда я сам с ним не работал, так что больше ничего сказать не могу.
UPD.
Досмотрел там же в конце:
Since 2.6.2, FPC has the functions LocalTimeToUniversal and UniversalTimeToLocal in the dateutils unit to convert between local time and UTC time. These functions can be useful and an alternative for PascalTZ if you are not interested in historical/future date/times (i.e. the functions use current daylight saving time etc to convert to/from UTC time).
Возможно, что этого достаточно.
С учетом того, что написал SSerge, если это для вас существенно, то есть пакет PascalTZ - "Pascal Time Zone". Правда я сам с ним не работал, так что больше ничего сказать не могу.
UPD.
Досмотрел там же в конце:
Since 2.6.2, FPC has the functions LocalTimeToUniversal and UniversalTimeToLocal in the dateutils unit to convert between local time and UTC time. These functions can be useful and an alternative for PascalTZ if you are not interested in historical/future date/times (i.e. the functions use current daylight saving time etc to convert to/from UTC time).
Возможно, что этого достаточно.
LocalTimeToUniversal and UniversalTimeToLocal in the dateutils работают с временными зонами и их установками только на момент запуска программы. По крайней мере, было так, когда я последний раз смотрел их код
Добавлено спустя 8 минут 51 секунду:
т.е.:
на момент запуска берется текущее смещение временной зоны;
в дальнейшем именно оно применяется для преобразования, без учета каких либо исторических изменений и переходов.
ЗЫ: кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.
Для размышления. Сишный timetolocal() тоже нещадно лажает под win.
Добавлено спустя 8 минут 51 секунду:
т.е.:
на момент запуска берется текущее смещение временной зоны;
в дальнейшем именно оно применяется для преобразования, без учета каких либо исторических изменений и переходов.
ЗЫ: кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.
-
tuzik87@inbox.ru
Спасибо за ответы. Чтобы не плодить темы еще задам вопрос про ExecuteProcess. Третьим параметром эта функция берет флаги. Где найти их описание?
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
SSerge писал(а):кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.
А *nix'ы знают всё историю изменения правил времени за всю человеческую историю?
Не, я не подъелдыкиваю, я весьма в них слаб, я и вправду не знаю.
Снег Север писал(а):А *nix'ы знают всё историю изменения правил времени за всю человеческую историю?
nix'ы тоже разные. Однако, под линуксами (не берем во внимание всякие сверхмалые дистрибутивы и дистрибутыивы роутеров и прочего с похеренной локализацией) история изменений правил применяется ровно настолько, насколько ее вписали в файлики tzone. То есть, если программа конвертировала даты из этой зоны в timestamp в 2014-м, то и в 2015-м она для этого timestamp и этой зоны возвратит корректное значение локальной даты. В отличие от W. У явы, кстати, работа с временными зонами отделена от ОС, и виртуальная машина несет все функции на себе, что особо не афишируется. Прошлый год был поэтому эпический - текущие обновления явы никак не затрагивали обновления временных зон, их надо было обновлять специальным инсталлятором. Что саом по себе подарок для тех, кто такого не ожидал.
Добавлено спустя 1 минуту 18 секунд:
fpc под линуксами с датами лажает так же, как и под windows.
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
SSerge
Спасибо за разъяснение.
Спасибо за разъяснение.
tuzik87@inbox.ru писал(а):Спасибо за ответы. Чтобы не плодить темы еще задам вопрос про ExecuteProcess. Третьим параметром эта функция берет флаги. Где найти их описание?
в документации, в документации
Снег Север писал(а):SSerge писал(а):кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.
А *nix'ы знают всё историю изменения правил времени за всю человеческую историю?![]()
Не, я не подъелдыкиваю, я весьма в них слаб, я и вправду не знаю.
Хотите увидеть самые точные правила?
Тогда вам к астрологам.
Это не шутка.
Никакая астрологическая программа не может существовать без точного расчёта времени.
Это у астрологов основа основ.
На сегодня, самые полные таблицы преобразований, временных зон по годам, это программа ZET.
Кстати написанная на какой-то старой версии Delphi.
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Спасибо, про астрономические вычисления и работу там с датами я в курсе. Даже сам немного с этим имел дело. Мой вопрос был немного не о том, и SSerge мне именно на него ответил.sign писал(а):На сегодня, самые полные таблицы преобразований, временных зон по годам, это программа ZET.
