時刻の設定方法は?

解決


マオ  2006-11-16 19:52:53  No: 23949

環境は、Delphi6.0, WindowsXPです。
システムの時刻を設定するにはどうすればよいのでしょうか?

EditHour
EditMinutes
EditSecond

それぞれの Text プロパティの値でシステムの時刻を設定したいのです。


えーとね  2006-11-16 21:05:40  No: 23950

試してませんが
http://www.swissdelphicenter.ch/en/showcode.php?id=90を参考に

const
  SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
var
  hToken: THandle;
  ReturnLength: DWORD;
  tkp, PrevTokenPriv: TTokenPrivileges;
  luid: TLargeInteger;
  dSysTime: TSystemTime;
begin
  if (Win32Platform = VER_PLATFORM_WIN32_NT) then
  begin
    if OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    begin
      try
        if not LookupPrivilegeValue(nil, SE_SYSTEMTIME_NAME, luid) then Exit;
        tkp.PrivilegeCount := 1;
        tkp.Privileges[0].luid := luid;
        tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTOKENPRIVILEGES),
          PrevTokenPriv, ReturnLength) then
          Exit;
        if (GetLastError <> ERROR_SUCCESS) then
        begin
          raise Exception.Create(SysErrorMessage(GetLastError));
          Exit;
        end;
      finally
        CloseHandle(hToken);
      end;
    end;
  end;
  GetLocalTime(dSysTime);
  dSysTime.wHour := strToint(EditHour.text);
  dSysTime.wMinute := strToint(EditMinutes.text);
  dSysTime.wMilliseconds := strToint(EditSecond.text);
  Windows.SetLocalTime(dSysTime);
end;


マオ  2006-11-16 22:20:09  No: 23951

わかりました。

どうやら、時間は指定時間から9を引かなければならないようです。
詳しい理由はわかりませんが、いくつかやってみてこうなってるようです。
確か9・・・って、グリニッジからの時差だったような。
それが、影響しているのかどうかわかりませんが
この方法で正しいのかどうか教えてください。
それとも、たまたまそうなっていたのでしょうか?
※サンプルはTEditをSpinEditに変えています。

 SysTime.wYear         := SpinEditYear.Value;
 SysTime.wMonth        := SpinEditMonth.Value;
 SysTime.wDay          := SpinEditDay.Value;
 SysTime.wHour         := SpinEditHour.Value - 9;
 SysTime.wMinute       := SpinEditMinute.Value;
 SysTime.wSecond       := SpinEditSecond.Value;
 SysTime.wMilliseconds := 0;
 SetSystemTime(SysTime);


えーとね  2006-11-16 22:43:21  No: 23952

> どうやら、時間は指定時間から9を引かなければならないようです。

上記URL の下のほうにある、GetTimeZoneInformationを使うと
分差を求めることが出来ます。それを足してください。

GetTimeZoneInformation(tTZI);
Hour:=ABS(tTZI.Bias) div 60;
Min:=ABS(tTZI.Bias) mod 60;


えーとね  2006-11-16 22:46:52  No: 23953

>  SetSystemTime(SysTime);
SetLocalTime(dSysTime); にすれば
GetTimeZoneInformationは要らないと思います。


マオ  2006-11-17 00:52:47  No: 23954

どうも、ありがとうございました。
解決しました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加