![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Snake_B |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Не могу разобраться как считать из реестра даные часовых поясов о датах перехода на летнее/зимнее время.
Хранятся тут: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ Параметр TZI, в reg_binary... ![]() |
![]() ![]() |
Ozzя |
![]()
Сообщение
#2
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
Взято из ДРКБ
Возможно, этот код сможет Вам помочь? uses Сообщение отредактировано: Ozzя - 29.04.2009 10:07 |
Snake_B |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Snake_B, зачем тебе реестр? Вызывай GetTimeZoneInformation Function, и смотри в полученной структуре поле DaylightDate (там будет дата перехода на летнее время для твоего часового пояса) и StandardDate (дата перехода от летнего назад к зимнему)...
|
Snake_B |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Snake_B, зачем тебе реестр? Вызывай GetTimeZoneInformation Function, и смотри в полученной структуре поле DaylightDate (там будет дата перехода на летнее время для твоего часового пояса) и StandardDate (дата перехода от летнего назад к зимнему)... мне нужно не только для своего часового пояса, в общем то для своего то мне как раз и не нужно, а для других часовых поясов.... или может быть стоит попробовать изменить системное время и считать этой функцией данные? |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
И с какого такого времени в реестре хранится эта информация для всех часовых поясов? У тебя она есть? Я только что открыл реестр - нашел только для своего пояса, и то не там, где ты указал, а в ветке с другим названием. Нет, если тебе надо эту мороку (на одной системе - путь один, на другой - ищи в другом месте), то можешь заморачиваться с реестром. Но вообще-то для предотвращения мороки есть WinAPI.
Цитата для своего то мне как раз и не нужно, а для других часовых поясов Зачем, можно уточнить? Ты что, спать не сможешь спокойно, если не будешь знать, когда Зимбабве переходит на летнее время? Смысл этой операции в чем? Я понимаю, для своего пояса вытягивать дату перехода, но для всех остальных - непонятно. |
Snake_B |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
И с какого такого времени в реестре хранится эта информация для всех часовых поясов? У тебя она есть? Я только что открыл реестр - нашел только для своего пояса, и то не там, где ты указал, а в ветке с другим названием. Нет, если тебе надо эту мороку (на одной системе - путь один, на другой - ищи в другом месте), то можешь заморачиваться с реестром. Но вообще-то для предотвращения мороки есть 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 или реестр... конечно на апи лучше бы было, но я такой функции вроде не встречал... п.с. кстати и как отдельную програмку сделать думаю не помешает... у нас вот на судне месяц назад не могли узнать когда время в египте переводится, они дату перевода изменили, а в винде правильная дата была... =) |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Ну, смотри... Ты сам хотел читать из реестра (на форме - кнопка и TMemo):
procedure TForm1.Button1Click(Sender: TObject); Выдает информацию вот в таком виде: ![]() (т.е, указывается не сама дата перехода, а ее описание: для Аляски - первое воскресенье ноября <-> второе воскресенье марта. Зная эти данные вычислить дату в текущем - да и вообще любом - году не должно быть большой проблемой)... |
Snake_B |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
Snake_B |
![]()
Сообщение
#10
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 считывать из реестра, а в висте и выше этой функцией) ? или может кто знает более простой способ... а то у меня уже скоро мозг закипит ![]() п.с. и может кто-нибудь подскажет по какому адресу в висте и 7-ке хранятся данные часовых поясов, которые раньше были тут - "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\"? я как бы сделал ini-файлы с этой информацией, но по хорошему лучше бы из реестра брать... Сообщение отредактировано: Snake_B - 1.09.2010 23:50 |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата мой делфи об этом не знает... как её подключить Как обычно, только тебе придется сначала еще и тип DYNAMIC_TIME_ZONE_INFORMATION описывать, о нем твоя Дельфи скорее всего тоже не знает:type Ну, или type , а потом переменная типа TGetDynamicTimeZoneInformation + GetProcAddress(нужной_dll), тоже все как обычно - ничего нового, все эти методы известны уже очень давно... Цитата вин 6-7 хранит эту информацию в другой ветке, даже не знаю где А вот это очень сомнительно, чтобы MS вот так взял и обрубил программы, написанные для предыдущей версии Windows, наплевав на обратную совместимость. Сейчас проверить негде - завтра посмотрю на Семерке. Но почему-то мне кажется, что там будет тот же путь... |
Snake_B |
![]()
Сообщение
#12
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Как обычно, только тебе придется сначала еще и тип DYNAMIC_TIME_ZONE_INFORMATION описывать, о нем твоя Дельфи скорее всего тоже не знает: спасибо... А вот это очень сомнительно, чтобы 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 - 2.09.2010 2:10 |
Lapp |
![]()
Сообщение
#13
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
а как этот параметр приравнять к NULL? А поставить на его месте "NULL" не пробовал? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Андрей, все-таки, nil, а не NULL
![]() Snake_B Я ж говорил, что не может такого быть, чтоб MS так обломала пользователей? Вот взял я тот свой код из сообщения №8 (прямо как есть, без изменений), и запустил на Семерке: ![]() Как видишь, результат - тот же, что и под XP. Так что проблема - на твоей стороне Возможно, пользователю запрещено чтение реестра. Может еще что-нибудь. Проверь, на каком именно этапе происходит сбой (по ветви Then во всех функциях из Registry у тебя идут действия, добавь еще ветку Else, в которой пиши, что именно пытался запустить и оно не сработало; добавь также подобную проверку у ReadBinaryData, это тоже функция, а не процедура...) |
Lapp |
![]()
Сообщение
#15
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Snake_B |
![]()
Сообщение
#16
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Андрей, все-таки, nil, а не NULL ![]() ну, вот так пробовал... GetTimeZoneInformationForYear(tDati, nil, tTZI); ругается (Incompatible types: '_time_dynamic)zone_information' and 'Pointer') Snake_B Я ж говорил, что не может такого быть, чтоб MS так обломала пользователей? Вот взял я тот свой код из сообщения №8 (прямо как есть, без изменений), и запустил на Семерке: ![]() Как видишь, результат - тот же, что и под XP. Так что проблема - на твоей стороне Возможно, пользователю запрещено чтение реестра. Может еще что-нибудь. Проверь, на каком именно этапе происходит сбой (по ветви Then во всех функциях из Registry у тебя идут действия, добавь еще ветку Else, в которой пиши, что именно пытался запустить и оно не сработало; добавь также подобную проверку у ReadBinaryData, это тоже функция, а не процедура...) фигня какая то... ну вот: Цитата установил на windows7 программу хочу добавить новую панель с другим городом,а списка с выпадающими городами нет. > Запустите прикрепленный файл и напишите появились или нет. да.пояса появились. спасибо. вот... в прикрепленном файле была экспортированная ветка реестра... т.е. если бы не смогли прочитать из реестра, то этот файл бы не помог... и ещё один пользователь жаловался на тоже самое, но он не ответил как у него ОС... а с другой стороны, вот ещё один пользователь пишет: Цитата 1. меньший минус - Для Висты Ультима 64(рус)заголовки разделов "Калькулятор времени" в корявках 2.главный минус - Выбора городов, как таковых нет.Только стандартная процедура выбора часового пояса в короткозначном поле т.е. у него на висте это всё сработало... м-да... чё то я с ними запутался )) Сообщение отредактировано: Snake_B - 2.09.2010 10:50 |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата ну, вот так пробовал... GetTimeZoneInformationForYear(tDati, nil, tTZI); Ну, и я попробовал - компилятор это сожрал запросто. Ошибку не выдал. Что-то не так у тебя. Посмотри, как описана эта функция (наводишь мышу на нее и ждешь пока появится описание), может там чего другое требуется? Дельфи-то какая? |
Snake_B |
![]()
Сообщение
#18
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, и я попробовал - компилятор это сожрал запросто. Ошибку не выдал. Что-то не так у тебя. Посмотри, как описана эта функция (наводишь мышу на нее и ждешь пока появится описание), может там чего другое требуется? Дельфи-то какая? делфи 2005... а на мышку у меня не реагирует, давно уже... ладно, эта функция в принципе и не нужна... Цитата т.е. у него на висте это всё сработало... м-да... чё то я с ними запутался )) в принципе... оно как бы не сильно и нужно, для других поясов из ini-файлов считать можно... единственная загвоздка с системным часовым поясом, для того чтобы его данные считать из ini-файла нужно узнать как он называется (вот такое - "Afghanistan Standard Time"), но GetTimeZoneInformation это название не возвращает... (потому что программа будет с русским/английским и те названия которые выдает GetTimeZoneInformation не подходят) Сообщение отредактировано: Snake_B - 2.09.2010 11:13 |
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
|
Snake_B |
![]()
Сообщение
#20
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 72 Пол: Мужской Репутация: ![]() ![]() ![]() |
Внимание, вопрос: А что тебе возвращает GetTimeZoneInformation в поле StandardName, можно посмотреть? Сделай просто вот так: ![]() и прилепи сюда картинку... не-а.... не то она возвращает... ![]() но всё, вопрос вроде закрыт... сделал через "LocalFileTimeToFileTime" (Kernel32.lib)... там на скриншоте виден код... надо только ещё проверить учитывает ли она этот DYNAMIC_TIME_ZONE_INFORMATION, а так всё работает... |
![]() ![]() |
![]() |
Текстовая версия | 23.06.2025 23:36 |