我读到的所有内容都说IIS使用本地机器时间和时区,因此,要更改有效时区和/或时间,我所需要做的就是更改服务器的时间和时区。它将更改IIS服务器看到的有效时间和时区。我有一台服务器运行一个简单的WCF服务,但这似乎对我不起作用。
该服务器位于太平洋地区的一个租赁农场,但自我们第一次设置以来,它已经配置了东部时区。我尝试过重置所有内容,甚至尝试过跳出框,所以我确信它不是缓存的时间值或其他简单的东西。然而,当我指着我的WCF代码试图理解为什么它会向所有消费服务发送三小时后的日期时,我发现IIS确信它在太平洋时区,尽管一切都是以其他方式配置的。
System.TimeZoneInfo.Local报告它在太平洋时间和DateTime。现在给我一个关闭三个小时的时间戳,我似乎不知道如何说服IIS它需要使用东部时间作为它正在创建和分发的记录的有效时区。
通常,服务器端代码应该而不是依赖于本地时区。从服务器应用程序调用TimeZoneInfo.Local
或DateTime.Now
通常是错误的。请参阅反对DateTime.Now.的案例
最佳做法是将服务器设置为协调世界时(UTC),然后编写应用程序在内部管理时区。如果您依赖东部时间,那么您的代码应该执行以下操作:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime now = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tz);
也就是说,如果TimeZoneInfo.Local.Id
返回Pacific Standard Time
,那么只有两种可能的解释:
您的系统确实是为太平洋时区设置的。
您的系统设置为太平洋时区,但您在没有重新启动或调用
TimeZoneInfo.ClearCachedData
的情况下对其进行了更改。
既然你在描述这个问题时已经消除了这两种解释,我只能说你设置时区的方式一定有问题。
请尝试在管理员提升的命令提示符下使用tzutil.exe
。tzutil /g
将为您提供当前时区设置。tzutil /s "Eastern Standard Time"
将为您设置美国东部时间的时区。请确保在更改时区后重新启动应用程序,方法是在管理控制台中回收应用程序池,使用iisreset
,重新启动IIS,或者(如果必须)重新启动服务器。
您也可以通过时区控制面板进行更改。
如果你说你已经完成了所有这些,并且你正在从tzutil /g
恢复"Eastern Standard Time"
,但即使你已经重新启动,TimeZoneInfo.Local.Id
仍在返回"Pacific Standard Time"
,那么我打电话给BS。这是不可能的。也许有一个更简单的解释,比如你可能部署到多个服务器,并且你在不同的服务器上设置时区,而不是从中获得结果。