Не могу разобраться как считать из реестра даные часовых поясов о датах перехода на летнее/зимнее время. Хранятся тут: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\ Параметр TZI, в reg_binary...
Ну, смотри... Ты сам хотел читать из реестра (на форме - кнопка и 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;
Выдает информацию вот в таком виде:
(т.е, указывается не сама дата перехода, а ее описание: для Аляски - первое воскресенье ноября <-> второе воскресенье марта. Зная эти данные вычислить дату в текущем - да и вообще любом - году не должно быть большой проблемой)...