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

> ВНИМАНИЕ!

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

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


Пионер
**

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

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


Цитата(Snake_B @ 2.09.2010 22:20) *

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


м-да... рано я обрадовался...
"LocalFileTimeToFileTime" это вот чудо для расчета времени UTC отнимает разницу с UTC которая в заданном у пользователя поясе СЕЙЧАС, при чем не зависимо от даты...
т.е. если сейчас летнее время и разница +3, то она выдаст UTC = LocalTime-3... даже если мы её зададим дату после того когда уже должен быть переход на зимнее время и разница будет +2...

вопросы...
1. такая вот функция
const DLL = 'ntdll.dll';
function RtlLocalTimeToSystemTime(LocalTime: LongInt; SystemTime: LongInt) : NTSTATUS; stdcall; external DLL name 'RtlLocalTimeToSystemTime';

как мне преобразовать TDateTime в LongInt ?
если и эта не сработает, то видимо прийдётся брать GetTimeZoneInformation...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.09.2010 22:20
Сообщение #22


Гость






Цитата
такая вот функция
const DLL = 'ntdll.dll';
function RtlLocalTimeToSystemTime(LocalTime: LongInt; SystemTime: LongInt) : NTSTATUS; stdcall; external DLL name 'RtlLocalTimeToSystemTime';
не сработает однозначно. Ибо прототип неправильный. Правильный - такой:
function RtlLocalTimeToSystemTime(
LocalTime: PLARGE_INTEGER;
SystemTime: PLARGE_INTEGER): NTSTATUS; stdcall;
external DLL name 'RtlLocalTimeToSystemTime';


(из исходников JEDI). Чувствуешь разницу, да? Указатели там на LARGE_INTEGER (он же Int64), а не просто LongInt-ы.

А насчет перевести в нужный формат - есть DateTimeToTimeStamp, которая это и делает.
 К началу страницы 
+ Ответить 
Snake_B
сообщение 3.09.2010 22:42
Сообщение #23


Пионер
**

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

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


Цитата(volvo @ 4.09.2010 7:20) *

не сработает однозначно. Ибо прототип неправильный. Правильный - такой:
function RtlLocalTimeToSystemTime(
LocalTime: PLARGE_INTEGER;
SystemTime: PLARGE_INTEGER): NTSTATUS; stdcall;
external DLL name 'RtlLocalTimeToSystemTime';


(из исходников JEDI). Чувствуешь разницу, да? Указатели там на LARGE_INTEGER (он же Int64), а не просто LongInt-ы.

А насчет перевести в нужный формат - есть DateTimeToTimeStamp, которая это и делает.


спасибо...
но сделал по другому...
GetTimeZoneInformation(tTZI);
DateTimeToSystemTime(tDati, st);
SystemTimeToTzSpecificLocalTime(@tTZI, st, lt);
оно DTZ учитывает... правда прийдется рассчитывать наоборот... ну да ладно...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Snake_B
сообщение 9.09.2010 2:54
Сообщение #24


Пионер
**

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

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


ну... у меня опять вопросик...
вот собственно код:
Код

                       ReadBinaryData('TZI',rTZ,SizeOf(RTZ));
                       rTZ.Bias:=-660;
                       WriteBinaryData('TZI',rTZ,SizeOf(RTZ));

в последней строке выдает ошибку (Failed to set data for TZI)...
значение rTZ.Bias до изменения -720...
вот как это дело победить? ))

вот если что полный код:
Код
procedure ProcessingTZInfos;
type TRec = record Bias, StdBias, DltBias: Integer; StdDate, DltDate: TSystemTime; end;
var PatchM: string; RootKey: HKEY; RTZ: TRec;
begin
        PatchM:='SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\';
        RootKey := HKEY_LOCAL_MACHINE;
        if RegKeyExists(RootKey, PatchM) then begin
                  with TRegistry.Create(KEY_READ) do try RootKey := HKEY_LOCAL_MACHINE;
                  if OpenKey(patchM+'Kamchatka Standard Time\', False) then begin
                       if Readstring('Display')='(GMT+12:00) Петропавловск-Камчатский' then begin
                            ReadBinaryData('TZI', rTZ, SizeOf(RTZ));
                            rTZ.Bias:=-660;
                            WriteBinaryData('TZI', rTZ, SizeOf(RTZ));
                            Writestring('Display', '(GMT+11:00) Магадан, Петропавловск-Камчатский, Курильские острова');
                       end;
                       CloseKey;
                  end;
                  finally Free; end;
        end;
end;


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


Пионер
**

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

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


Цитата(Snake_B @ 9.09.2010 11:54) *

ну... у меня опять вопросик...
вот собственно код:
Код

                       ReadBinaryData('TZI',rTZ,SizeOf(RTZ));
                       rTZ.Bias:=-660;
                       WriteBinaryData('TZI',rTZ,SizeOf(RTZ));

в последней строке выдает ошибку (Failed to set data for TZI)...
значение rTZ.Bias до изменения -720...
вот как это дело победить? ))

вот если что полный код:
with TRegistry.Create(KEY_READ) do try RootKey := HKEY_LOCAL_MACHINE;


туплю...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 24.06.2025 9:46
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"