TimeZoneInfo (アプリ #1) を変更する方法は次のとおりです。
private static void ChangeTimeZone(TimeZoneInfo tzi)
{
TIME_ZONE_INFORMATION actual = new TIME_ZONE_INFORMATION();
NativeMethods.GetTimeZoneInformation(out actual);
if (tzi == null || actual.StandardName == tzi.StandardName)
return;
TIME_ZONE_INFORMATION newZone = (TIME_ZONE_INFORMATION)tzi;
RunWin32Method(() => NativeMethods.SetTimeZoneInformation(ref newZone));
// Update .NET
CultureInfo.CurrentCulture.ClearCachedData();
TimeZoneInfo.ClearCachedData();
// Notify all windows that we changed a Windows setting.
// result is True
IntPtr ptr;
System.Diagnostics.Debug.WriteLine(NativeMethods.SendMessageTimeout(NativeMethods.HWND_BROADCAST, NativeMethods.WMI_SETTING_CHANGE,
IntPtr.Zero, IntPtr.Zero, 0x00, 1000, out ptr));
}
メソッドを呼び出すと:
ChangeTimeZone(TimeZoneInfo.GetSystemTimeZones().First(e => !e.SupportsDaylightSavingTime));
// Stopping debugger and watching other .NET App then continue to next instruction
ChangeTimeZone(TimeZoneInfo.GetSystemTimeZones().First(e => e.StandardName.Contains("Romance")));
別のアプリ (アプリ #2) は次のとおりです。
static void Main(string[] args)
{
while (true)
{
Console.WriteLine(DateTime.Now);
Thread.Sleep(500);
}
}
DateTime の出力が新しい TimeZone に更新されないのはなぜですか?
編集
@Jonが言ったようにCultureInfo.CurrentCulture.ClearCachedData();
、新しい日付を追加することで更新されます。しかし、前述のように、他のすべてのアプリケーションがこの新しい TimeZone を使用することを望みます。を使用して多くのアプリをバックグラウンドで実行していDateTime.Now
ます。ローカルの更新日を取得する前にキャッシュをクリアするたびに指定するのは良くありません...