Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
1-71747
Olfi
2003-09-10 11:33
2003.09.22
Работа с множествами


1-71739
Vova!
2003-09-10 13:44
2003.09.22
Копирование файлов


14-71946
Dmitriy O.
2003-09-02 16:28
2003.09.22
Как можно получить палитру 256 цветов Виндовс


1-71620
ray_w
2003-09-09 12:53
2003.09.22
Кавычки???


1-71702
Петр
2003-09-11 07:12
2003.09.22
Кто-нибудь знает формат почтового файла dbx