Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

TIME_ZONE, или как определить сторону света.   Найти похожие ветки 

 
mfender   (2003-09-09 04:05) [0]

Как вычислить разницу локального и системного времени особого ума не надо. А вот как постичь, с какой стороны эта разница? На западе, или на востоке от Лондона...
Вобщем, существует ли где-то в системе (наверняка есть) такой определитель, чтобы сразу стало ясно, что разница, к примеру, 3 часа равна -3, т.е. где-то в районе Канады, а не в СПБ.
Вот такой коварный вопрос.


 
[lamer]Barmaglot   (2003-09-09 09:50) [1]

GetTimeZoneInformation ?


 
mfender   (2003-09-09 13:53) [2]

А как бы им воспользоваться, и что там есть что?

typedef struct _TIME_ZONE_INFORMATION { // tzi
LONG Bias;
WCHAR StandardName[ 32 ];
SYSTEMTIME StandardDate;
LONG StandardBias;
WCHAR DaylightName[ 32 ];
SYSTEMTIME DaylightDate;
LONG DaylightBias;
} TIME_ZONE_INFORMATION;

Что это?


 
DmS   (2003-09-09 13:55) [3]

что именно надо узнать ?


 
mfender   (2003-09-09 14:02) [4]

Нужно узнать, в какую сторону от нулевого меридиана лежит искомая TimeZone.
SystemTimeToDateTime(GetLocalTime(SYSTEMTIME))-SystemTimeToDateTime(GetSystemTime(SYSTEMTIME)) дает всегда правильный, но положительный результат (видимо, потому что время не может быть отрицательным. А нужно знать, правильные цифры. Т.е. если на восточном побережье США -5 часов разница, то хотелось бы видеть именно -5 часов разницы, а не 5.


 
DmS   (2003-09-09 14:04) [5]

тогда делай по другому: преобразуй оба времени в TDateTime и вычитай на здоровье.


 
han_malign   (2003-09-09 14:21) [6]

>дает всегда правильный, но положительный результат
- гоните батенька, GMT: -12..+13, а TDateTime бывает и отрицательный(например 01.01.998 12:31:17).

З.Ы. А еще летнее/зимнее время есть... :p


 
mfender   (2003-09-09 14:21) [7]

Я так и написал:
SystemTimeToDateTime(GetLocalTime(SYSTEMTIME))-SystemTimeToDateTime(GetSystemTime(SYSTEMTIME))
Разница-то всегда положительная. А вокруг нулевого меридиана таймзоны находятся в диапазоне от -12 до +12 часов. Так вот как вычислить, положительная или отрицательная разница?


 
mfender   (2003-09-09 14:23) [8]

>TDateTime бывает и отрицательный(например 01.01.998 12:31:17).

И чего же тут отрицательного?


 
[lamer]Barmaglot   (2003-09-09 14:59) [9]

Пользуйся Windows"кими функциями. Они надежнее чем личные расчеты...

Приблизительно так:

procedure TForm1.Button1Click(Sender: TObject);
var
timezone, Timezone1: _Time_Zone_Information;
t, t1: SystemTime;
begin
GetTimeZoneInformation(TimeZone);
Edit1.text:=inttostr(Timezone.Bias);
end;

Получаем разницу между нашим и гринвическим временем в минутах. Если установить (SetTimeZoneInformation) отличным от этого, то при вызове GetLocalTime получишь другое время... Вообщем поэкспериментируй...


 
mfender   (2003-09-09 15:11) [10]

Получилось, но вот какая интересная штука. Сам попробуй:

procedure TForm1.Button1Click(Sender: TObject);
var st, lt: TSYSTEMTIME;
TZ: _TIME_ZONE_INFORMATION;
begin
GetSystemTime(st);
GetLocalTime(lt);
GetTimeZoneInformation(TZ);
ShowMessage("Разница между локальным и системным временем: "
+FormatDateTime("h",SystemTimeToDateTime(lt)-SystemTimeToDateTime(st))+" часа,"
+#10#13+"а разница TimeZone.Bias: "+IntToStr(TZ.Bias div 60)+" часа.");
end;

Почему такая порча?


 
mfender   (2003-09-09 15:17) [11]

Пораскинув мозгами, попробую сам ответить. Очевидно это из-за того, что разница локального и системного времени после осеннего солнцестояния (21 сентября) станет равной bias"у, т.к. будет случиться перход на зимнее время (читай - нормальное). А в Bias"е прописана фиксированная разница, та, которую я сам указал при установке системы. Правильно?


 
DmS   (2003-09-09 15:22) [12]

я в шоке !!!

автор ! читай про TDateTime ! твои вопросы отпадут сами собой !


 
han_malign   (2003-09-09 15:22) [13]

ну родной...
>FormatDateTime("h",SystemTimeToDateTime(lt)-SystemTimeToDateTime(st))+" часа,"

(SystemTimeToDateTime(lt)-SystemTimeToDateTime(st)) это для FormatDateTime - 01.01.1900 04:00:00
The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am

а я еще думаю где это он дату потерял.
IntToStr(round((SystemTimeToDateTime(lt)-SystemTimeToDateTime(st))*24)) - "спасут отца русской демократии"


 
[lamer]Barmaglot   (2003-09-09 15:22) [14]

Tz.DaylightBias ?


 
mfender   (2003-09-09 15:40) [15]

Ок. Спасибо всем. Очень познавательно. Углубляюсь в изучение SDK.


 
DmS   (2003-09-09 15:47) [16]


var
t1, t2 : _SYSTEMTIME;
td1, td2 : TDateTime;

...

GetSystemTime(t1);
GetLocalTime(t2);

td1:=SystemTimeToDateTime(t1);
td2:=SystemTimeToDateTime(t2);

if td1 < td2 then
MessageDlg("мы на востоке", mtInformation, [mbOk], 0)
else
MessageDlg("мы на западе", mtInformation, [mbOk], 0);



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
14-71918
Vovchik_A
2003-09-04 16:40
2003.09.22
Анек


3-71470
Alecs
2003-09-02 12:27
2003.09.22
Работа с ISQL.exe из командной строки


1-71645
SH
2003-09-08 14:20
2003.09.22
Подсветка синтаксиса


9-71459
[Baradoo]
2003-03-20 22:48
2003.09.22
Налет хакеров на сервера от hotbox и mail


14-71951
lobster
2003-09-04 00:53
2003.09.22
заголовки функций из dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский