C# 在Azure Web应用程序上更改时区不会';DateTimeOffset不工作。现在?

C# 在Azure Web应用程序上更改时区不会';DateTimeOffset不工作。现在?,c#,asp.net,datetime,azure,azure-web-app-service,C#,Asp.net,Datetime,Azure,Azure Web App Service,,Microsoft启用了使用应用程序设置(网站时区)控制web服务器时区的功能 为了尝试这个方法,我将这个值设置为“东部标准时间”,这是我的本地时区 在ASP.NET MVC Razor页面上,我添加了以下代码: DateTime.Now: @DateTime.Now DateTimeOffset.Now: @DateTimeOffset.Now DateTime.UtcNow: @DateTimeOffset.UtcNow 当我昨晚在东部标准时间下午5:10:07运行时,它给出了以下输出:

,Microsoft启用了使用应用程序设置(网站时区)控制web服务器时区的功能

为了尝试这个方法,我将这个值设置为“东部标准时间”,这是我的本地时区

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

DateTime.Now: @DateTime.Now
DateTimeOffset.Now: @DateTimeOffset.Now
DateTime.UtcNow: @DateTimeOffset.UtcNow
当我昨晚在东部标准时间下午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
如您所见,该设置正确地允许
DateTime.Now
在我的时区中返回正确的值,而不是像Azure网站/Web应用通常那样在UTC中返回正确的值
DateTime.UtcNow
总是返回正确的值,原因显而易见

但是,
DateTimeOffset。现在
返回本地时间,但偏移量为
+00:00
——几乎就像时钟改变了而不是时区一样。这种情况发生时,即使强调(我的):

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


那么,
网站\u时区
设置会影响
日期时间。现在
但不会影响
日期时间偏移。现在
?我有什么办法可以绕过这个问题吗


作为澄清,我真的不想更改服务器上的时区。我们正在研究一种与时区无关的解决方案。但我仍然很好奇为什么会发生这种情况。

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

在深入研究CLR代码之后,似乎是因为本地时区是根据系统注册表查找的。由于Azure Web应用程序在共享虚拟机上运行,因此,如果不更改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);

对我来说,它现在就起作用了。如果它不工作,请确保设置正确的值

  • 打开regedit
  • 搜索“时区”
  • 检查区域是如何写入的。例如,我的区域是“东部东部标准时间(+2)”,在注册表中它的名称是“欧洲东部标准时间”

  • 因此,我在azure应用程序中添加了应用程序设置“网站时区:欧洲标准时间”,对于那些偶然发现这个问题的人来说,它很有效。

    。这已经修复了很长时间。

    您真的需要更改服务器的时区吗?我将尽可能避免这一要求。我同意DateTimeOffset是一种奇怪的行为。现在,请注意……我正在讨论在OP中解释这一点。我更希望不要更改服务器的时区。就在探索这些选项时,我偶然发现了这个选项,不明白它是如何工作的(或者为什么它没有按照我的想法工作)。所以我想我应该试着澄清一下。这是有道理的——我完全赞成尝试一些你实际上不想做的事情:)你可能不是第一个注意到这里有些奇怪的人:
    WEBSITE\u timeu\u ZONE
    似乎根本没有改变时区我已经将时区设置为GMT,但我仍然看到UTC调整了一小时的时间,以匹配GMT中的时间:
    {“Id”:“UTC”,“DisplayName”:(UTC)协调世界时”,“StandardName”:“协调世界时”,“DaylightName”:“协调世界时”,“BaseUtcOffset”:“00:00:00”,“调整规则”:null,“SupportsDaylightSavingTime”:false}
    这个答案很有效,但regedit搜索有点傻(我要找的值甚至不在我的注册表中)。这些值应该发布在某个地方,而不是必须这样做。无论如何,供日本参考,数值为“东京标准时间”。这里有一篇很棒的博文(仅限Jp)@starmandeluxe最好是开始使用UTC,现在我必须迁移到UTC:(这需要一点努力才能做到。谢谢你的建议!不幸的是,我和你在同一条船上,工作在一个遗留代码库上,由于需要不断发布,所以无法立即迁移。现在我只需要它工作就行了。