Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.029 c
6-1117644962
Dok
2005-06-01 20:56
2005.09.25
широковещательный connect


4-1122916656
wqer
2005-08-01 21:17
2005.09.25
Local disks


14-1125921191
ПЛОВ
2005-09-05 15:53
2005.09.25
Посоветуйте PHP редактор


1-1125402131
Energetik
2005-08-30 15:42
2005.09.25
как сравнить значения ячеек из разных файлов excel


1-1125383823
Rogis
2005-08-30 10:37
2005.09.25
Функция заглючила





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский