![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TDateTime и зимнее/летнее время и пересчёт из/в UNUX Timestamp [D7, WinXP]
mfender © (2005-11-12 11:08:00)Здравствуйте все! Давненько меня тут не было. :)
Проблема такая:
В таблице MySQL я храню дату/время в Integer, как это предусмотрено в PHP (количество секунд, прошедших с 1 января 1970 года). На локальной машине пересчитываю его для TDateTime так:
function DT2Unix(DT: TDateTime): Integer;
begin
Result := ((Trunc(DT) - 25569) * 86400) +
Trunc(86400 * (DT - Trunc(DT))) - 7200;
end;
function Unix2DT(DT: Integer): TDateTime;
begin
Result := ((DT + 7200) / 86400) + 25569;
end;
Получается такая бодяга: время отстаёт на час в случае зимнего времени (сейчас), а записи, сделанные в летнее время отстают на два часа.
Уже всю голову сломал... Где я могу ошибаться?
mfender (2005-11-12 15:14:00) [1]
> Может тебе будет полезнее SystemTimeToTzSpecificLocalTime
> Зачем вручную бороться?
Посмотрю, попробую. Спасибо.
Anatoly Podgoretsky (2005-11-12 13:46:00) [2]Может тебе будет полезнее SystemTimeToTzSpecificLocalTime
Зачем вручную бороться?
mfender (2005-11-12 12:48:00) [3]Спасибо, Анатолий. Помогло. :)
mfender (2005-11-12 12:27:00) [4]
> Anatoly Podgoretsky © (12.11.05 12:04) [4]
> Эти функции были не всегда.
Согласен.
> Anatoly Podgoretsky © (12.11.05 12:11) [5]
> GetTimeZoneInformation для текущей зоны
Я нашел её описание в help'е, но как её использовать? В частности, как взять оттуда Bias? Я не очень-то умею пользоваться этими функциями. Где она хоть находится?
Anatoly Podgoretsky (2005-11-12 12:11:00) [5]GetTimeZoneInformation для текущей зоны
Anatoly Podgoretsky (2005-11-12 12:04:00) [6]Эти функции были не всегда.
mfender (2005-11-12 11:58:00) [7]
> Anatoly Podgoretsky © (12.11.05 11:45) [2]
> А ты не храни по Гринцичу, а храни в UTC
Анатолий, я бы с радостью, но слишком многое придётся менять (к тому же, я думаю, что функция time() в PHP время выдаёт именно UTC). Суть не в том.
Пытаюсь найти, где в системе хранится информация о временной зоне. Потому и спрашиваю, не знает-ли кто этого?
Кстати, пока искал, обнаружил, что в DateUtils есть две замечательные функции: UnixToDateTime и DateTimeToUnix. А я-то высчитывал... :)))
Anatoly Podgoretsky (2005-11-12 11:45:00) [8]А ты не храни по Гринцичу, а храни в UTC
mfender (2005-11-12 11:14:00) [9]Я тормоз. Сам же встрамил эти 7200 секунд... :)))
Теперь код выглядит так:
function DT2Unix(DT: TDateTime): Integer;
begin
Result := ((Trunc(DT) - 25569) * 86400) +
Trunc(86400 * (DT - Trunc(DT))) ;
end;
function Unix2DT(DT: Integer): TDateTime;
begin
Result := (DT / 86400) + 25569;
end;
Но проблема остаётся. Время, как уже было сказано, хранится по Гринвичу. Чем в Delphi можно перевести его в локальное?