SetTimeZoneInformation 不会为另一个 .NET 应用程序更新 DateTime.Now

本文关键字:应用程序 更新 DateTime Now NET 另一个 SetTimeZoneInformation | 更新日期: 2023-09-27 18:30:54

这是我更改时区信息(应用程序#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);
    }
}

日期时间的输出永远不会更新到新的时区,为什么?


编辑

正如@Jon所说,通过添加CultureInfo.CurrentCulture.ClearCachedData();,新日期将被更新。但如前所述,我希望所有其他应用程序都使用这个新时区。我有很多使用 DateTime.Now 在后台运行的应用程序,在检索本地更新日期之前指定每次清除缓存会很糟糕......

SetTimeZoneInformation 不会为另一个 .NET 应用程序更新 DateTime.Now

我怀疑您的第二个应用程序只是使用缓存的时区数据。(毕竟,这是一个单独的进程 - 清除应用 1 中的缓存不会影响应用 2 中的任何进程内缓存。尝试在应用程序 2 中调用TimeZoneInfo.ClearCachedData,看看是否可以解决问题。