C# C“DateTime.ToString”;o";Format在Azure上返回不同的字符串
我有一个场景,我想将UTC日期转换为ISO 8601字符串,并带有特定的时区,以便通过web api发送。推荐的方法是使用TimeZoneInfo,如下所示:C# C“DateTime.ToString”;o";Format在Azure上返回不同的字符串,c#,.net,azure,datetime,iso8601,C#,.net,Azure,Datetime,Iso8601,我有一个场景,我想将UTC日期转换为ISO 8601字符串,并带有特定的时区,以便通过web api发送。推荐的方法是使用TimeZoneInfo,如下所示: var configuredTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneString); var localTime = DateTime.SpecifyKind(TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTime
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,configuredTimeZone)
语句会将UTC时间转换为您的时间(20日午夜),但由于DateTime
不包含时区,因此它属于DateTimeKind.Unspecified
。您的DateTime.SpecifyKind(…,DateTimeKind.Local)
简单地告诉它是“Local”类型,对于Azure主机,是UTC+00:00
如果时区很重要,您希望使用而不是
DateTime
。它是专门为保存和操作(顾名思义)时区偏移量而构建的。DateTime
无法存储时区。Azure中的本地时区是UTC。我正在通过TimeZoneInfo.ConvertTimeFromUtc手动提供我想要的时区,那么Azure使用UTC会如何影响转换?