在Azure Web Apps上更改TimeZone不适用于DateTimeOffset.Now?

Tim*_*Tim 17 c# asp.net datetime azure azure-web-sites

根据 多个 帖子,微软能够使用的应用程序设置的能力- WEBSITE_TIME_ZONE-控制Web服务器的时区.

为了尝试这个,我将此值设置为"东部标准时间",这是我当地的时区.

在ASP.NET MVC Razor页面上,我添加了以下代码:

DateTime.Now: @DateTime.Now
DateTimeOffset.Now: @DateTimeOffset.Now
DateTime.UtcNow: @DateTimeOffset.UtcNow
Run Code Online (Sandbox Code Playgroud)

昨晚我在东部标准时间下午5:10:07运行这个时,它给出了以下输出:

DateTime.Now: 6/18/2015 5:10:07 PM
DateTimeOffset.Now: 6/18/2015 5:10:07 PM +00:00
DateTime.UtcNow: 6/18/2015 9:10:07 PM
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,正确设置允许DateTime.Now在我的时区中返回正确的值,而不是像Azure网站/ Web应用程序那样返回UTC.DateTime.UtcNow由于显而易见的原因,它总是返回正确的值.

但是,DateTimeOffset.Now返回本地时间,但偏移量为+00:00- 几乎就像时钟被改变而不是时区一样.即使文档说明(强调我的),也会发生这种情况:

获取DateTimeOffset对象,该对象在当前计算机上设置为当前日期和时间,偏移量设置为本地时间与协调世界时(UTC)的偏移量.

那么该WEBSITE_TIME_ZONE设置会产生什么影响,DateTime.Now但它不会产生影响DateTimeOffset.Now?有什么方法可以解决这个问题吗?

作为澄清的一点,我真的不想改变服务器上的时区.我们正在制定适当的时区独立解决方案.但我仍然很好奇为什么会这样.

Vol*_*hat 5

对我来说它现在很有效.如果它不起作用,请确保设置正确的值

  1. 打开注册表
  2. 搜索"时区"
  3. 检查区域的编写方式.例如我的区域是"东部EST(+2)",在注册表中它的名称是"E. Europe Standard Time"

所以我添加到azure应用程序中的应用程序设置"WEBSITE_TIME_ZONE: E. Europe Standard Time",它的工作原理.


小智 0

我遇到了同样的问题。对我来说不幸的是,我继承了许多专门为东部标准时间编写的遗留代码,因此更新它以使用 UTC 基本上不是一个选择。

深入研究 CLR 代码后,似乎是因为本地时区是根据系统注册表查找的。由于 Azure Web Apps 在共享 VM 上运行,因此不知道他们如何在不更改 CLR 代码的情况下正确支持这一点。

目前,我将在站点启动时通过以下反射黑客来解决这个问题,以欺骗 .Net 使其认为它处于东部标准时间。这不是一个很好的解决方案,如果他们更改 TimeZoneInfo 类的实现,很可能会中断,但希望他们更改它的原因是为了解决这个问题。

// rewrite local timezone
var tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

var fInfo = typeof(TimeZoneInfo).GetField("s_cachedData", BindingFlags.Static|BindingFlags.NonPublic);
var cachedData = fInfo.GetValue(null);

fInfo = cachedData.GetType().GetField("m_localTimeZone", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
fInfo.SetValue(cachedData, tz);
Run Code Online (Sandbox Code Playgroud)