编程语言
首页 > 编程语言> > C#DateTime.ToString“ o”格式在Azure上返回不同的字符串

C#DateTime.ToString“ o”格式在Azure上返回不同的字符串

作者:互联网

我有一种情况,我想将UTC日期转换为具有特定时区的ISO 8601字符串,以通过Web api发送.推荐的方法是使用TimeZoneInfo,如下所示:

var configuredTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneString);
var localTime = DateTime.SpecifyKind(TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone), DateTimeKind.Local);
var stringResult = localTime.ToString("o");

这在我的本地计算机上运行良好,但是我遇到了一种非常奇怪的情况,即当代码托管在Azure Web应用程序中时,ToString输出不同的字符串.我在本地得到2017-02-20T00:00:00-06:00(这就是我想要的,因为它包含我需要的时区信息),但是当托管在Azure中时,我得到2017-02-20T00:00:00 00 :00.(使用UTC,不是我想要的).由于我是手动应用所需的时区,因此我不确定为什么格式会附加错误的时区信息.有人遇到过吗?

解决方法:

如注释中所述,System.DateTime无法存储时区.它所知道的只是“本地”或“ UTC”.托管在Azure中,其“本地”时间为UTC.

因此,您的TimeZoneInfo.ConvertTimeFromUtc(utcTime,configureTimeZone)语句会将UTC时间转换为您的时间(20日午夜),但是由于DateTime没有时区,因此它是DateTimeKind.Unspecified.您的DateTime.SpecifyKind(…,DateTimeKind.Local)仅告诉它它是“本地”类型,对于Azure主机,它是UTC 00:00.

如果时区很重要,则要使用System.DateTimeOffset而不是DateTime.它是专门为保留和操纵(如其名称所暗示的)时区偏移量而构建的.

标签:azure,iso8601,datetime,c,net
来源: https://codeday.me/bug/20191026/1934831.html