C# TimeZoneInfo.ConvertTimeFromUtc未在已部署的Azure Webjob上正确应用DST

C# TimeZoneInfo.ConvertTimeFromUtc未在已部署的Azure Webjob上正确应用DST,c#,azure,azure-webjobs,dst,.net-4.7.1,C#,Azure,Azure Webjobs,Dst,.net 4.7.1,我们有一个在.Net Framework 4.7.1上运行的webjob,它执行从DateTimeOffset.UtcNow到智利大陆时间的日期时间转换(如果我没有弄错的话,就是“太平洋标准时间”) 当在本地(在Windows 10计算机上)运行此webjob时,它工作正常并应用DST执行转换,但当部署到Azure应用程序服务时,它不再工作,并且最终日期时间总是比当前正式时间晚一小时 最初我从“代码> TimeZoNeNo..CurrdTimeBythyTysOnID ID/COD>切换到Tim

我们有一个在.Net Framework 4.7.1上运行的webjob,它执行从
DateTimeOffset.UtcNow
到智利大陆时间的日期时间转换(如果我没有弄错的话,就是“太平洋标准时间”)

当在本地(在Windows 10计算机上)运行此webjob时,它工作正常并应用DST执行转换,但当部署到Azure应用程序服务时,它不再工作,并且最终日期时间总是比当前正式时间晚一小时

最初我从“代码> TimeZoNeNo..CurrdTimeBythyTysOnID ID/COD>切换到TimeZoNeNo.CurnTimeTimeFutuxC <代码>,假设第一个不考虑DST但不工作;p> 然后,我尝试将自己的电脑切换为“错误”,将时区更改为“UTCdstoff”,并在“调整日期/时间”菜单中禁用“自动调整夏令时”和“自动设置时间”选项,但在本地仍能按预期工作

我最后尝试过的一件事是使用环境变量
WEBSITE\u TIME\u ZONE
将时区更改为应用程序服务,但这不是结论。我想说,它最初似乎起了作用,但在时区发生一些变化后,它又开始增加一个小时

这可以通过以下行进行复制:

var timeZoneId=“太平洋标准时间”;
var timeZone=TimeZoneInfo.findsystemtimezonebyd(timeZoneId);
var dateTimeOffset=dateTimeOffset.UtcNow;
var localTime=TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime,时区);

我希望在本地和Azure应用程序服务中选择带有DST的时区时,函数
TimeZoneInfo.ConvertTimeFromUtc
将正确应用DST。相反,它似乎在Windows 10中正常工作,但在Azure应用程序服务中是随机的。

在Azure上,将
网站\u时区添加到
太平洋SA标准时间
,并使用如下结构方法:

DateTime timeUtc = DateTime.UtcNow;
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time"); 
DateTime kstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, timeZone );

更新

中涵盖的更改的时区更新似乎尚未应用于Azure应用程序服务。这就解释了为什么在某些日期,您在本地得到的结果与部署到Azure时不同

4486459包含在中,目前仍在部署到Azure应用程序服务。因此,当单个实例接收更新时,此问题将自行解决


原始答案

有几件事:

  • WEBSITE\u timeu\u ZONE
    仅当您的代码无法更改且与当地时间一致时才应使用。例如,如果您有许多对
    DateTime.Now
    的调用,则这将反映本地时区。更改
    WEBSITE\u TIME\u ZONE
    将更改用于确定该时间的时区。如果您可以控制自己的代码,那么就不要编写
    DateTime.Now
    ,也不要使用依赖于本地时区的任何其他函数。然后,您将永远不需要使用此设置。认为这是最后一招——而不是一种推荐的做事方式。

  • 一般来说,您应该尽量避免编写服务器端代码,这些代码会根据系统时区设置而改变其行为,无论是本地计算机上的控制面板中的设置,还是上面提到的
    WEBSITE\u time\u zone
    设置

  • 这并不重要,但“自动调整夏令时”设置几乎应始终保持打开状态。禁用它(或通过将
    dstoff
    传递到
    TZUtil.exe
    )主要是一种遗留设置。(有一个罕见的edge案例,但不值得在这里讨论。)

  • 是的,
    “太平洋标准时间”
    是智利大陆(圣地亚哥)的正确Windows时区ID。其他适用于智利的是蓬塔竞技场(
    “马加兰标准时间”
    )和复活节岛(
    “复活节岛标准时间”

  • 请注意,智利2019年夏令时计划的日期发生了变化。这是微软在2019年2月发布的更新。此更新应已安装在您的Azure网站上,但您可能希望验证您自己的本地计算机

  • 您说您最初使用的是
    TimeZoneInfo.ConvertTimeBySystemTimeZoneId
    。如果使用的重载接受
    日期时间
    ,请注意,如果
    种类
    日期时间种类.未指定
    ,则它将被视为本地时间。如果未更改
    网站\u时区
    ,则默认本地时间为UTC。但是如果你这样做了,那会影响你的行为

  • 还要注意,当您请求
    DateTimeOffset
    .DateTime
    属性时,该类将始终是
    DateTimeKind.Unspecified
    。尽管这不会影响您当前的代码,因为
    TimeZoneInfo.ConvertTimeFromUtc
    将未指定的种类视为UTC(因此名称中有“FromUTC”)

  • 如果您使用的是
    DateTimeOffset
    类型,最好使用
    TimeZoneInfo.ConvertTimeBySystemTimeZoneId
    或只使用
    TimeZoneInfo.ConvertTime
    ,使用接受并返回
    DateTimeOffset
    的重载。那么,
    DateTimeKind
    就不会妨碍你了

最后,我要指出的是,你的问题不是很清楚,到底是什么不起作用。您展示的代码最终将做正确的事情,即使它并不理想。无论您是否更改了系统设置或
网站\u时区
,都不会产生间歇性结果。你是否可能只是在不同的日期和时间喂食,看到一些有DST,而另一些没有?如果是这样,这可能是完全正常的。我想要