2

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ます。ローカルの更新日を取得する前にキャッシュをクリアするたびに指定するのは良くありません...

4

1 に答える 1

5

あなたの 2 番目のアプリは、キャッシュされたタイム ゾーン データを使用しているだけだと思います。(結局のところ、別のプロセスにあります。アプリ 1 でキャッシュをクリアしても、アプリ 2 のプロセス内キャッシュには影響しません。)TimeZoneInfo.ClearCachedDataアプリ 2 で呼び出して、問題が解決するかどうかを確認してください。

于 2012-04-13T08:17:27.443 に答える