Аналог difftime

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аналог difftime

Сообщение tuzik87@inbox.ru » 07.07.2015 22:53:07

Есть ли во Free Pascal RTL аналог Сишной функции difftime?
tuzik87@inbox.ru
постоялец
 
Сообщения: 155
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Аналог difftime

Сообщение sign » 08.07.2015 07:12:51

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;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Аналог difftime

Сообщение tuzik87@inbox.ru » 08.07.2015 13:24:04

sign, Спасибо за ответ
tuzik87@inbox.ru
постоялец
 
Сообщения: 155
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Аналог difftime

Сообщение SSerge » 08.07.2015 13:53:48

tuzik87@inbox.ru
С одним "но". Система представления дат в FPC совершенно не учитывает временные зоны, летнее время и прочее. И потому SecondsBetween(const ANow, AThen: TDateTime) может дать неправильный результат и, соответственно, результат, отличающийся от difftime();

TDateTime - "мемориальное" абстрактное время, непригодное для отметок времени по сути.
time_t - unix timestamp, всегда в UTC. Правильное представление. :D
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Аналог difftime

Сообщение Снег Север » 08.07.2015 14:04:34

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).
Возможно, что этого достаточно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Аналог difftime

Сообщение SSerge » 08.07.2015 16:44:52

LocalTimeToUniversal and UniversalTimeToLocal in the dateutils работают с временными зонами и их установками только на момент запуска программы. По крайней мере, было так, когда я последний раз смотрел их код

Добавлено спустя 8 минут 51 секунду:
т.е.:
на момент запуска берется текущее смещение временной зоны;
в дальнейшем именно оно применяется для преобразования, без учета каких либо исторических изменений и переходов.

ЗЫ: кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более. :evil: Для размышления. Сишный timetolocal() тоже нещадно лажает под win.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Аналог difftime

Сообщение tuzik87@inbox.ru » 08.07.2015 17:33:45

Спасибо за ответы. Чтобы не плодить темы еще задам вопрос про ExecuteProcess. Третьим параметром эта функция берет флаги. Где найти их описание?
tuzik87@inbox.ru
постоялец
 
Сообщения: 155
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Аналог difftime

Сообщение Снег Север » 08.07.2015 18:43:25

SSerge писал(а):кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.

А *nix'ы знают всё историю изменения правил времени за всю человеческую историю? :roll:
Не, я не подъелдыкиваю, я весьма в них слаб, я и вправду не знаю.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Аналог difftime

Сообщение SSerge » 08.07.2015 19:03:59

Снег Север писал(а):А *nix'ы знают всё историю изменения правил времени за всю человеческую историю?


nix'ы тоже разные. Однако, под линуксами (не берем во внимание всякие сверхмалые дистрибутивы и дистрибутыивы роутеров и прочего с похеренной локализацией) история изменений правил применяется ровно настолько, насколько ее вписали в файлики tzone. То есть, если программа конвертировала даты из этой зоны в timestamp в 2014-м, то и в 2015-м она для этого timestamp и этой зоны возвратит корректное значение локальной даты. В отличие от W. У явы, кстати, работа с временными зонами отделена от ОС, и виртуальная машина несет все функции на себе, что особо не афишируется. Прошлый год был поэтому эпический - текущие обновления явы никак не затрагивали обновления временных зон, их надо было обновлять специальным инсталлятором. Что саом по себе подарок для тех, кто такого не ожидал.

Добавлено спустя 1 минуту 18 секунд:
fpc под линуксами с датами лажает так же, как и под windows.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Аналог difftime

Сообщение Снег Север » 08.07.2015 19:25:21

SSerge
Спасибо за разъяснение.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47

Re: Аналог difftime

Сообщение скалогрыз » 08.07.2015 23:02:20

tuzik87@inbox.ru писал(а):Спасибо за ответы. Чтобы не плодить темы еще задам вопрос про ExecuteProcess. Третьим параметром эта функция берет флаги. Где найти их описание?


в документации, в документации
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Аналог difftime

Сообщение sign » 09.07.2015 06:51:48

Снег Север писал(а):
SSerge писал(а):кстати, windows - реализации как СИ, так и .NET в своих временных функциях "видят" только правила работы с временем текущего года, и не более.

А *nix'ы знают всё историю изменения правил времени за всю человеческую историю? :roll:
Не, я не подъелдыкиваю, я весьма в них слаб, я и вправду не знаю.

Хотите увидеть самые точные правила?
Тогда вам к астрологам.
Это не шутка.
Никакая астрологическая программа не может существовать без точного расчёта времени.
Это у астрологов основа основ.
На сегодня, самые полные таблицы преобразований, временных зон по годам, это программа ZET.
Кстати написанная на какой-то старой версии Delphi.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Аналог difftime

Сообщение Снег Север » 09.07.2015 07:41:58

sign писал(а):На сегодня, самые полные таблицы преобразований, временных зон по годам, это программа ZET.
Спасибо, про астрономические вычисления и работу там с датами я в курсе. Даже сам немного с этим имел дело. Мой вопрос был немного не о том, и SSerge мне именно на него ответил.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3052
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru