C# TimeZoneInfo.ConvertTimeFromUtc未在已部署的Azure Webjob上正确应用DST
我们有一个在.Net Framework 4.7.1上运行的webjob,它执行从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
DateTimeOffset.UtcNow
到智利大陆时间的日期时间转换(如果我没有弄错的话,就是“太平洋标准时间”)
当在本地(在Windows 10计算机上)运行此webjob时,它工作正常并应用DST执行转换,但当部署到Azure应用程序服务时,它不再工作,并且最终日期时间总是比当前正式时间晚一小时
最初我从“代码> TimeZoNeNo..CurrdTimeBythyTysOnID ID/COD>切换到
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,而另一些没有?如果是这样,这可能是完全正常的。我想要