Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 можно перевести его в локальное?


Наверх

Титульная страница Поиск, карта сайта Написать письмо