Функция SetSystemTime.

Обрати внимание на привилегии.

 Автор ответа: podval

 

Следующий пример демонстрирует обработку сообщения WM_TIMECHANGE. Приложение, которое изменяет системное время, посылает сообщение WM_TIMECHANGE всем окнам верхнего уровня.

 

Code:

{ **** UBPFD ***************

>> Определение текущего времени(часы, минуты, секунды)

 Зависимости: SysUtils, Classes

Автор:       Eagle, Copyright:   MegaSoft

***************************************************** }

 

unit gettime;

 

interface

uses SysUtils, Classes;

 

function gethours: integer;

function getmins: integer;

function getsecs: integer;

 

implementation

 

function gethours: integer;

var

s: string;

h: integer;

begin

s := timetostr(time);

h := strtoint(s[1] + s[2]);

Result := h;

end;

 

function getmins: integer;

var

s: string;

h: integer;

begin

s := timetostr(time);

h := strtoint(s[4] + s[5]);

Result := h;

end;

 

function getsecs: integer;

var

s: string;

h: integer;

begin

s := timetostr(time);

h := strtoint(s[7] + s[8]);

Result := h;

end;

 

end.

 

 

  

Code:

Shellexecute(handle, 'Open', 'Rundll32.exe', 'shell32.dll,Control_RunDLL TIMEDATE.CPL', Pchar(Getsystemdir), 0);

 

Code:

procedure AM_or_PM;

begin

  if Frac(Time) = 0 then

    ShowMessage('AM')

  else

    ShowMessage('PM');

end;

 

 

Code:

uses

Registry;

 

...

 

var

reg : TRegistry;

ts : TStrings;

i : integer;

begin

reg := TRegistry.Create;

reg.RootKey := HKEY_LOCAL_MACHINE;

reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones', false);

if reg.HasSubKeys then

begin

   ts := TStringList.Create;

   reg.GetKeyNames(ts);

   reg.CloseKey;

   for i := 0 to ts.Count -1 do

   begin

     reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones\' + ts.Strings[i], false);

     Memo1.Lines.Add(ts.Strings[i]);

     Memo1.Lines.Add(reg.ReadString('Display'));

     Memo1.Lines.Add(reg.ReadString('Std'));

     Memo1.Lines.Add(reg.ReadString('Dlt'));

     Memo1.Lines.Add('----------------------');

     reg.CloseKey;

   end;

   ts.Free;

end

else

   reg.CloseKey;

reg.free;

end;

 

HKEYLocalMachine/Software/Microsoft/Windows/CurrentVersion/TimeZones/ - место, где в регистре хранится информация о временных зонах (Timezone). Двоичный код 'TZI' хранит информацию о начале и конце летнего времени. Есть какие-нибудь идеи насчет извлечения этих дат из этой двоичной величины?

 Попробуем описать решение тут:

 

 

Code:

// Wait 0.2ms

 

procedure PerformanceDelay;

var

hrRes, hrT1, hrT2, dif: Int64;

begin

if QueryPerformanceFrequency(hrRes) then

begin

   QueryPerformanceCounter(hrT1);

   repeat

     QueryPerformanceCounter(hrT2);

     dif := (hrT2 - hrT1) * 10000000 div hrRes;

   until dif > 2;

end;

end;

 

Code:

function Is24HourTimeFormat: Boolean;

var

  DefaultLCID: LCID;

begin

  DefaultLCID := GetThreadLocale;

  Result := 0 <> StrToIntDef(GetLocaleStr(DefaultLCID,

    LOCALE_ITIME,'0'), 0);

end;

 

 

Хранится в глобальных переменных now, date, time

Code:

procedure TForm1.Button4Click(Sender: TObject);

var

lt: TSYSTEMTIME;

st: TSYSTEMTIME;

begin

GetLocalTime(lt);

GetSystemTime(st);

Memo1.Lines.Add('LocalTime = ' +

   IntToStr(lt.wmonth) + '/' +

   IntToStr(lt.wDay) + '/' +

   IntToStr(lt.wYear) + ' ' +

   IntToStr(lt.wHour) + ':' +

   IntToStr(lt.wMinute) + ':' +

   IntToStr(lt.wSecond));

Memo1.Lines.Add('UTCTime = ' +

   IntToStr(st.wmonth) + '/' +

   IntToStr(st.wDay) + '/' +

   IntToStr(st.wYear) + ' ' +

   IntToStr(st.wHour) + ':' +

   IntToStr(st.wMinute) + ':' +

   IntToStr(st.wSecond));

end;