IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Считывание даных часовых поясов из реестра..., Даты перехода на зимнее/летнее время...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Не могу разобраться как считать из реестра даные часовых поясов о датах перехода на летнее/зимнее время.
Хранятся тут:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Параметр TZI, в reg_binary... unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Взято из ДРКБ
Возможно, этот код сможет Вам помочь?

uses
Registry;
// Write TDateTime to Registry
procedure Reg_WriteDateTime(dwRootKey: DWord; const sKey: string; const sField: string; aDate: TDateTime);
begin
with TRegistry.Create do
try
RootKey := dwRootKey;
if OpenKey(sKey, True) then
begin
try
WriteBinaryData(sField, aDate, SizeOf(aDate));
finally
CloseKey;
end;
end;
finally
Free;
end;
end;

// Read TDateTime from Registry
function Reg_ReadDateTime(dwRootKey: DWord; const sKey: string; const sField: string) : TDateTime;
begin
Result := 0; // default Return value
with TRegistry.Create do
begin
RootKey := dwRootKey;
if OpenKey(sKey, False) then
begin
try
ReadBinaryData(sField, Result, SizeOf(Result));
finally
CloseKey;
end;
end;
Free;
end;
end;

// Example:
// Write DateTimePicker1's DateTime to Registry
procedure TForm1.Button1Click(Sender: TObject);
begin
Reg_WriteDateTime(HKEY_CURRENT_USER, 'Software\TestXYZ\','DateTime',DateTimePicker1.DateTime);
end;

// Set DateTimePicker1's DateTime from Registry
procedure TForm1.Button2Click(Sender: TObject);
var
ATime: TDateTime;
begin
ATime := Reg_ReadDateTime(HKEY_CURRENT_USER, 'Software\TestXYZ\','DateTime');
if ATime <> 0 then
DateTimePicker1.DateTime := TDateTime(ATime);
end;


Сообщение отредактировано: Ozzя -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(Ozzя @ 29.04.2009 19:07) *

Взято из ДРКБ
Возможно, этот код сможет Вам помочь?
[code=pas][/code]


Не-а, не получается. Там по идее должны хранится две даты и время (переход на летнее и на зимнее)...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Snake_B, зачем тебе реестр? Вызывай GetTimeZoneInformation Function, и смотри в полученной структуре поле DaylightDate (там будет дата перехода на летнее время для твоего часового пояса) и StandardDate (дата перехода от летнего назад к зимнему)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 30.04.2009 4:24) *

Snake_B, зачем тебе реестр? Вызывай GetTimeZoneInformation Function, и смотри в полученной структуре поле DaylightDate (там будет дата перехода на летнее время для твоего часового пояса) и StandardDate (дата перехода от летнего назад к зимнему)...


мне нужно не только для своего часового пояса, в общем то для своего то мне как раз и не нужно, а для других часовых поясов.... или может быть стоит попробовать изменить системное время и считать этой функцией данные?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






И с какого такого времени в реестре хранится эта информация для всех часовых поясов? У тебя она есть? Я только что открыл реестр - нашел только для своего пояса, и то не там, где ты указал, а в ветке с другим названием. Нет, если тебе надо эту мороку (на одной системе - путь один, на другой - ищи в другом месте), то можешь заморачиваться с реестром. Но вообще-то для предотвращения мороки есть WinAPI.

Цитата
для своего то мне как раз и не нужно, а для других часовых поясов
Зачем, можно уточнить? Ты что, спать не сможешь спокойно, если не будешь знать, когда Зимбабве переходит на летнее время? Смысл этой операции в чем? Я понимаю, для своего пояса вытягивать дату перехода, но для всех остальных - непонятно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.05.2009 7:58) *

И с какого такого времени в реестре хранится эта информация для всех часовых поясов? У тебя она есть? Я только что открыл реестр - нашел только для своего пояса, и то не там, где ты указал, а в ветке с другим названием. Нет, если тебе надо эту мороку (на одной системе - путь один, на другой - ищи в другом месте), то можешь заморачиваться с реестром. Но вообще-то для предотвращения мороки есть WinAPI.

Зачем, можно уточнить? Ты что, спать не сможешь спокойно, если не будешь знать, когда Зимбабве переходит на летнее время? Смысл этой операции в чем? Я понимаю, для своего пояса вытягивать дату перехода, но для всех остальных - непонятно.


гм...
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
а точно там проверяли? Windows NT и Windows не перепутали? у меня XP sp2...
А в реестре должна(!) храниться информация для всех поясов, винда же должна знать когда переводить время, при чём как в москве, например, так и если в зимбабве в отпуск уехали...

зачем... ну, не сочтите за рекламу, вот:
MultiClock.SB - программа для отображении времени в разных часовых поясах. Совместима с операционными системами Windows 2000/XP и выше.
http://sbgames.narod.ru/multiclock.sb.html

из-за отсутствия информации о датах перехода ошибки c некоторыми поясами по паре недель в году, а в некоторых до полугода (если там не переводится)... Теоретически по работе я могу найти эти данные, есть у нас на судне описания портов =)... но эти даты иногда меняются, а книжки переиздаются не часто... поэтому лучше эти данные из винды взять... вот как то так...
Мне то без разницы WinApi или реестр... конечно на апи лучше бы было, но я такой функции вроде не встречал...

п.с. кстати и как отдельную програмку сделать думаю не помешает... у нас вот на судне месяц назад не могли узнать когда время в египте переводится, они дату перевода изменили, а в винде правильная дата была... =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ну, смотри... Ты сам хотел читать из реестра (на форме - кнопка и TMemo):
procedure TForm1.Button1Click(Sender: TObject);

function title_wday(Dt: integer): string;
const
days: array[1 .. 7] of string = (
'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
);
begin
case Dt of
1 .. 12: Result := days[Dt];
else Result := '#Err#';
end;
end;

function title_month(Dt: integer): string;
const
months: array[1 .. 12] of string = (
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
);
begin
case Dt of
1 .. 12: Result := months[Dt];
else Result := '#Err#';
end;
end;

function TZISysTimeToStr(tm: TSystemTime): string;
var
ADT: TDateTime;
sWhich: string;
begin
with tm do begin
if wMonth = 0 then Result := 'No time saved.'
else begin
ADT := EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
case wDay of
1: sWhich := '1st';
2: sWhich := '2nd';
3: sWhich := '3rd';
4: sWhich := '4th';
5: sWhich := 'last';
end;
Result := Format('%s, %s %s in %s',
[TimeToStr(ADT), sWhich, title_wday(wDayOfWeek + 1), title_month(wMonth)]);
end;
end;
end;

type
TRec = record
Bias, StdBias, DltBias: Integer;
StdDate, DltDate: TSystemTime;
end;

var
Keys: TStringList;
i: integer;
var
RTZ: TRec;
Description, DisplayData: string;
DT: TDateTime;
begin
with TRegistry.Create(KEY_READ) do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones',false) then
begin
Keys := TStringList.Create();
try
GetKeyNames(Keys);
CloseKey;
for i := 0 to Keys.Count -1 do
begin
if OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\'+Keys[i], False) then
begin
begin
Description := ReadString('Std');
DisplayData := ReadString('Display');
ReadBinaryData('TZI',rTZ,SizeOf(RTZ)) ;
Memo1.Lines.Add(
Description + ' ' +
DisplayData + ' ' +
' Bias: ' + IntToStr(RTZ.Bias) +
' SDate: ' + TZISysTimeToStr(RTZ.StdDate) +
' SBias: ' + IntToStr(RTZ.StdBias) +
' DDate: ' + TZISysTimeToStr(RTZ.DltDate) +
' DBias: ' + IntToStr(RTZ.DltBias)
);

end;
CloseKey;
end;

end;

finally
FreeAndNil(Keys);
end;
end;

finally
Free;
end;
end;

Выдает информацию вот в таком виде:
Прикрепленное изображение

(т.е, указывается не сама дата перехода, а ее описание: для Аляски - первое воскресенье ноября <-> второе воскресенье марта. Зная эти данные вычислить дату в текущем - да и вообще любом - году не должно быть большой проблемой)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.05.2009 20:17) *

Ну, смотри... Ты сам хотел читать из реестра (на форме - кнопка и TMemo):


Спасибо =)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 30.04.2009 4:24) *

Snake_B, зачем тебе реестр? Вызывай GetTimeZoneInformation Function, и смотри в полученной структуре поле DaylightDate (там будет дата перехода на летнее время для твоего часового пояса) и StandardDate (дата перехода от летнего назад к зимнему)...


такой вот вопрос... собственно имеем системное время и дату (не сегодняшние), надо посчитать сколько в это время будет в гринвиче...
брать данные из реестра нельзя (вин 6-7 хранит эту информацию в другой ветке, даже не знаю где, но она и не нужна), можно вот этим получить - GetTimeZoneInformation Function... но тут что всплывает, для некоторых часовых поясов есть "Dynamic DST", т.е. переход на летнее/зимнее время происходит в разные дни каждый год... в win 6 добавили функцию "GetDynamicTimeZoneInformation Function"...

Minimum supported client Windows Vista
Minimum supported server Windows Server 2008
Header Winbase.h (include Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

но мой делфи об этом не знает... как её подключить (тогда наверно можно будет сделать так - в 2k и XP считывать из реестра, а в висте и выше этой функцией) ?
или может кто знает более простой способ... а то у меня уже скоро мозг закипит wacko.gif

п.с. и может кто-нибудь подскажет по какому адресу в висте и 7-ке хранятся данные часовых поясов, которые раньше были тут - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\"?
я как бы сделал ini-файлы с этой информацией, но по хорошему лучше бы из реестра брать...


Сообщение отредактировано: Snake_B -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
мой делфи об этом не знает... как её подключить
Как обычно, только тебе придется сначала еще и тип DYNAMIC_TIME_ZONE_INFORMATION описывать, о нем твоя Дельфи скорее всего тоже не знает:

type
_TIME_DYNAMIC_ZONE_INFORMATION = record
Bias: Longint;
StandardName: array [0..31] of WCHAR;
StandardDate: SYSTEMTIME;
StandardBias: Longint;
DaylightName: array [0..31] of WCHAR;
DaylightDate: SYSTEMTIME;
DaylightBias: Longint;
TimeZoneKeyName: array [0..127] of WCHAR;
DynamicDaylightTimeDisabled: BOOL;
end;
DYNAMIC_TIME_ZONE_INFORMATION = _TIME_DYNAMIC_ZONE_INFORMATION;
PDYNAMIC_TIME_ZONE_INFORMATION = ^DYNAMIC_TIME_ZONE_INFORMATION;

// а уж потом - твоя функция:
function GetDynamicTimeZoneInformation(
var pTimeZoneInformation: DYNAMIC_TIME_ZONE_INFORMATION): DWORD; stdcall;
external 'kernel32' name 'GetDynamicTimeZoneInformation';



Ну, или
type
TGetDynamicTimeZoneInformation =
function (var pTimeZoneInformation: DYNAMIC_TIME_ZONE_INFORMATION): DWORD; stdcall;

, а потом переменная типа TGetDynamicTimeZoneInformation + GetProcAddress(нужной_dll), тоже все как обычно - ничего нового, все эти методы известны уже очень давно...

Цитата
вин 6-7 хранит эту информацию в другой ветке, даже не знаю где
А вот это очень сомнительно, чтобы MS вот так взял и обрубил программы, написанные для предыдущей версии Windows, наплевав на обратную совместимость. Сейчас проверить негде - завтра посмотрю на Семерке. Но почему-то мне кажется, что там будет тот же путь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.09.2010 10:43) *

Как обычно, только тебе придется сначала еще и тип DYNAMIC_TIME_ZONE_INFORMATION описывать, о нем твоя Дельфи скорее всего тоже не знает:


спасибо...

Цитата(volvo @ 2.09.2010 10:43) *

А вот это очень сомнительно, чтобы MS вот так взял и обрубил программы, написанные для предыдущей версии Windows, наплевав на обратную совместимость. Сейчас проверить негде - завтра посмотрю на Семерке. Но почему-то мне кажется, что там будет тот же путь...


ну, программа ни чего по тем путям не находит... а мне и проверить не где...


п.с. и ещё вопросик...
вот такая функция "GetTimeZoneInformationForYear Function"
BOOL WINAPI GetTimeZoneInformationForYear(
__in USHORT wYear,
__in_opt PDYNAMIC_TIME_ZONE_INFORMATION pdtzi,
__out LPTIME_ZONE_INFORMATION ptzi
);

pdtzi [in, optional]
A pointer to a DYNAMIC_TIME_ZONE_INFORMATION structure that specifies the time zone. If this parameter is NULL, the current time zone is used.

а как этот параметр приравнять к NULL?

Сообщение отредактировано: Snake_B -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Snake_B @ 2.09.2010 2:52) *
а как этот параметр приравнять к NULL?

А поставить на его месте "NULL" не пробовал?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Андрей, все-таки, nil, а не NULL smile.gif

Snake_B
Я ж говорил, что не может такого быть, чтоб MS так обломала пользователей? Вот взял я тот свой код из сообщения №8 (прямо как есть, без изменений), и запустил на Семерке:
Прикрепленное изображение

Как видишь, результат - тот же, что и под XP. Так что проблема - на твоей стороне Возможно, пользователю запрещено чтение реестра. Может еще что-нибудь. Проверь, на каком именно этапе происходит сбой (по ветви Then во всех функциях из Registry у тебя идут действия, добавь еще ветку Else, в которой пиши, что именно пытался запустить и оно не сработало; добавь также подобную проверку у ReadBinaryData, это тоже функция, а не процедура...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 2.09.2010 10:27) *
Андрей, все-таки, nil, а не NULL smile.gif
фу ты ну ты..! lol.gif
+1


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.09.2010 18:27) *

Андрей, все-таки, nil, а не NULL smile.gif


ну, вот так пробовал...
GetTimeZoneInformationForYear(tDati, nil, tTZI);
ругается (Incompatible types: '_time_dynamic)zone_information' and 'Pointer')

Цитата(volvo @ 2.09.2010 18:27) *

Snake_B
Я ж говорил, что не может такого быть, чтоб MS так обломала пользователей? Вот взял я тот свой код из сообщения №8 (прямо как есть, без изменений), и запустил на Семерке:
Прикрепленное изображение

Как видишь, результат - тот же, что и под XP. Так что проблема - на твоей стороне Возможно, пользователю запрещено чтение реестра. Может еще что-нибудь. Проверь, на каком именно этапе происходит сбой (по ветви Then во всех функциях из Registry у тебя идут действия, добавь еще ветку Else, в которой пиши, что именно пытался запустить и оно не сработало; добавь также подобную проверку у ReadBinaryData, это тоже функция, а не процедура...)


фигня какая то... ну вот:

Цитата
установил на windows7 программу
хочу добавить новую панель с другим городом,а списка с выпадающими
городами нет.

> Запустите прикрепленный файл и напишите появились или нет.

да.пояса появились. спасибо.


вот... в прикрепленном файле была экспортированная ветка реестра... т.е. если бы не смогли прочитать из реестра, то этот файл бы не помог...

и ещё один пользователь жаловался на тоже самое, но он не ответил как у него ОС...

а с другой стороны, вот ещё один пользователь пишет:
Цитата
1. меньший минус - Для Висты Ультима 64(рус)заголовки разделов "Калькулятор времени" в корявках
2.главный минус - Выбора городов, как таковых нет.Только стандартная процедура выбора часового пояса в короткозначном поле

т.е. у него на висте это всё сработало...
м-да... чё то я с ними запутался ))

Сообщение отредактировано: Snake_B -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата
ну, вот так пробовал...
GetTimeZoneInformationForYear(tDati, nil, tTZI);

Ну, и я попробовал - компилятор это сожрал запросто. Ошибку не выдал. Что-то не так у тебя. Посмотри, как описана эта функция (наводишь мышу на нее и ждешь пока появится описание), может там чего другое требуется? Дельфи-то какая?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.09.2010 20:01) *

Ну, и я попробовал - компилятор это сожрал запросто. Ошибку не выдал. Что-то не так у тебя. Посмотри, как описана эта функция (наводишь мышу на нее и ждешь пока появится описание), может там чего другое требуется? Дельфи-то какая?


делфи 2005... а на мышку у меня не реагирует, давно уже... ладно, эта функция в принципе и не нужна...

Цитата
т.е. у него на висте это всё сработало...
м-да... чё то я с ними запутался ))


в принципе... оно как бы не сильно и нужно, для других поясов из ini-файлов считать можно... единственная загвоздка с системным часовым поясом, для того чтобы его данные считать из ini-файла нужно узнать как он называется (вот такое - "Afghanistan Standard Time"), но GetTimeZoneInformation это название не возвращает... (потому что программа будет с русским/английским и те названия которые выдает GetTimeZoneInformation не подходят)

Сообщение отредактировано: Snake_B -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Цитата
(вот такое - "Afghanistan Standard Time"), но GetTimeZoneInformation это название не возвращает
Внимание, вопрос: А что тебе возвращает GetTimeZoneInformation в поле StandardName, можно посмотреть? Сделай просто вот так:
Прикрепленное изображение
и прилепи сюда картинку...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 2.09.2010 21:58) *

Внимание, вопрос: А что тебе возвращает GetTimeZoneInformation в поле StandardName, можно посмотреть? Сделай просто вот так:
Прикрепленное изображение
и прилепи сюда картинку...


не-а.... не то она возвращает...
Прикрепленное изображение

но всё, вопрос вроде закрыт... сделал через "LocalFileTimeToFileTime" (Kernel32.lib)... там на скриншоте виден код...
надо только ещё проверить учитывает ли она этот DYNAMIC_TIME_ZONE_INFORMATION, а так всё работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 30.04.2024 11:34
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name