C# SetTimeZoneInformation不更新另一个.NET应用程序的DateTime.Now

C# SetTimeZoneInformation不更新另一个.NET应用程序的DateTime.Now,c#,pinvoke,C#,Pinvoke,以下是我如何更改时区信息(应用程序1): 当我调用我的方法时: ChangeTimeZone(TimeZoneInfo.GetSystemTimeZones().First(e => !e.SupportsDaylightSavingTime)); // Stopping debugger and watching other .NET App then continue to next instruction ChangeTimeZone(TimeZoneInfo.GetSystemTi

以下是我如何更改时区信息(应用程序1):

当我调用我的方法时:

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):

DateTime的输出永远不会更新到新时区,为什么


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

我怀疑你的第二个应用程序只是使用缓存的时区数据。(毕竟,这是一个单独的过程——清除应用程序1中的缓存不会影响应用程序2中的任何进程内缓存。)尝试调用应用程序2,看看这是否能解决问题。

@ArnaudF:不幸的是,如果客户端应用程序需要最新的时区信息,我认为确实需要由客户端应用程序清除缓存。我认为.NET甚至不会公开“时区信息已更改,您可能希望清除缓存”事件。(我认为有一个Win32版本,但它没有暴露在.NET中。)对我来说,启动
WMI\u SETTINGCHANGE
应该可以做到这一点。。。建议在MSDN上提升它。为什么.NET不考虑此设置?我没有所有.NET运行应用程序的源代码,其中一些应用程序需要有正确的日期时间…@ArnaudF.:
WM\u SETTINGCHANGE
(注意拼写)需要一个带有消息循环的顶级窗口。您不希望.NET为每个加载.NET的应用程序创建这样的应用程序。按照我的说法,这是不符合逻辑的,我认为很多处理DateTime的开发人员都希望得到这个结果,但不管怎样,他们都会按照你的方式去做。谢谢。
TimeZoneInfo.Local
在第一次使用时创建并缓存(通过从注册表读取时区信息)。除非您使用
TimeZoneInfo.ClearCachedData
,否则它将不会在当前AppDomain中重新创建。因此,如果要重新计算有关本地时区的信息,就必须清除缓存。不要在每次调用
DateTime时都这样做。现在
您需要有一个顶级窗口,并对
WM\u SETTINGCHANGE
消息做出反应。
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")));
static void Main(string[] args)
{
    while (true)
    {
        Console.WriteLine(DateTime.Now);
        Thread.Sleep(500);
    }
}