Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизПодскажите, пожалуйста, как перевести дату и время в Найти похожие ветки
← →
Артем К. (2005-08-30 07:39) [0]дату и время по Гринвичу?
Спасибо!
← →
dmitry501 © (2005-08-30 08:00) [1]Копи-пасте из хелпа к Delphi
------------------------------------------------------------------------------------------
Примеры применения функций локального времени
1.
Пусть в переменной T типа TDateTime хранятся дата и время некоторого события по московскому времени. И вы хотите в переменную TLoc типа TDateTime занести локальные дату и время вашего часового пояса, соответствующее этому событию. Такой пересчет можно сделать следующим кодом:
var lpTimeZoneInformation: TTimeZoneInformation;
T, TLoc: TDateTime;
...
if (GetTimeZoneInformation(lpTimeZoneInformation) = TIME_ZONE_ID_STANDARD)
then
TLoc := T + (-180 - lpTimeZoneInformation.Bias - lpTimeZoneInformation.StandardBias) / (60 * 24)
else
TLoc := T + (-180 - lpTimeZoneInformation.Bias - lpTimeZoneInformation.DaylightBias) / (60 * 24);
ShowMessage(DateTimeToStr(T) + #13 + DateTimeToStr(TLoc));
Оператор if вызывает функцию GetTimeZoneInformation, которая заполняет запись lpTimeZoneInformation типа TTimeZoneInformation информацией о локальном времени. Анализируется значение, возвращенное функцией, и определяется, функционирует ли в данный момент зимнее или летнее время. В зависимости от этого определяется сдвиг локального времени. Для определения локального времени, соответствующего значению T, формируется суммарный сдвиг, который делится на (60 * 24) – т.е. на число минут в сутках. Для формирования сдвига сначала вычитается 180. Так как смещение московского времени -180, то тем самым время T приводится к согласованному универсальному времени (Coordinated Universal Time - UTC или время по Гринвичу). Затем к этому времени добавляется локальный сдвиг, величина которого зависит от того, функционирует ли в данный момент зимнее или летнее время. Последний оператор отображает сообщение, содержащее исходное московское и вычисленное локальное время.
2.
Приведенный код предполагал, что на компьютере задана полная информация о переходе на летнее и зимнее время, т.е. в записи типа TTimeZoneInformation заданы значения полей StandardDate и DaylightDate. В этом случае, если функция GetTimeZoneInformation не вернула TIME_ZONE_ID_STANDARD, значит время летнее. Но в некоторых случаях информация о зимнем и летнем времени может быть не полная. Так что в общем случае вместо содержащегося в приведенном коде оператора if лучше использовать case:
case (GetTimeZoneInformation(lpTimeZoneInformation)) of
TIME_ZONE_ID_STANDARD:
TLoc := T + (-180 - lpTimeZoneInformation.Bias - lpTimeZoneInformation.StandardBias) / (60 * 24);
TIME_ZONE_ID_DAYLIGHT:
TLoc := T + (-180 - lpTimeZoneInformation.Bias - lpTimeZoneInformation.DaylightBias) / (60 * 24);
TIME_ZONE_ID_UNKNOWN:
TLoc := T + (-180 - lpTimeZoneInformation.Bias) / (60 * 24);
else
ShowMessage("Ошибка");
exit;
end;
3.
Пусть теперь мы хотим решить обратную задачу – перевести текущее локальное время в московское. Это можно сделать следующим кодом:
var lpTimeZoneInformation: TTimeZoneInformation;
T, TMos: TDateTime;
...
T := Now;
if (GetTimeZoneInformation(lpTimeZoneInformation) = TIME_ZONE_ID_STANDARD)
then
TMos := T + (lpTimeZoneInformation.Bias + lpTimeZoneInformation.StandardBias + 180) / (60 * 24)
else
TMos := T + (lpTimeZoneInformation.Bias + lpTimeZoneInformation.DaylightBias + 180) / (60 * 24);
ShowMessage(DateTimeToStr(T) + #13 + DateTimeToStr(TMos));
Код аналогичен приведенному ранее. Текущее время определяется функцией Now. Далее прибавление к полученному значению соответствующего локального смещения время переводится к стандартному, а прибавлением 180 стандартное время приводится к московскому.
В данном примере вместо функции Now можно было бы воспользоваться функцией API Windows GetLocalTime. Но тогда бы код заметно усложнился:
var lpSystemTime: TSystemTime;
...
GetLocalTime(lpSystemTime);
T := SystemTimeToDateTime(lpSystemTime);
← →
han_malign © (2005-08-30 09:53) [2]>dmitry501 © (30.08.05 08:00) [1]
>В данном примере вместо функции Now можно было бы воспользоваться функцией API Windows GetLocalTime. Но тогда бы код заметно усложнился
- э-э-э, а можно воспользоваться функцией API Windows GetSystemTime, которая возвращает время в Coordinated Universal Time (UTC) - то бишь, по гринвичу... - и код бы значительно упростился...
← →
Anatoly Podgoretsky © (2005-08-30 09:53) [3]Артем К. (30.08.05 07:39)
Зачем тебе время по Гринвичу? Обычно интерес обычно предсвляет универсальное кординированое время, ака UTC
← →
han_malign © (2005-08-30 10:01) [4]>Anatoly Podgoretsky ©(30.08.05 09:53)[3]
- UTC и GMT в простонародье обычно не различают...
".................
С 1900 г средний солнечный день увеличился на 0,002 атомные секунды, и, стало быть, Гринвичское среднее время расходится с международным атомным временем приблизительно на 1 сек за каждые 500 суток. Беря во внимание этот прогрессирующий фазовый сдвиг между двумя шкалами времени и не отказываясь от высокой точности, предлагаемой атомными часами, в 1972 г был найден компромисс, который привел к определению понятия Универсального Координированного Времени (UTC), которое сейчас используется как официальная мера времени в мире. По сути время UTC течет как международное атомное время, а когда разница с Гринвичским временем достигает 1 секунды, к шкале UTC добавляется 1 секунда, которая называется прыгающей (leap second). Таким образом, разница все время поддерживается меньшей, чем 0,9 сек. Про добавление прыгающей секунды сообщается Международной Службой Вращения Земли (IERS), которая непрерывно контролирует скорость вращения. Наилучшими датами для добавления прыгающей секунды являются 30 июня и 31 декабря. Кстати, термин UTC тоже является компромиссом между английским CUT (Coordinated Universal Time) и французским TUC (Temps Universel Coordlnaire).
................."
http://www.qrz.ru/help/utc.shtml
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c