Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“DateTime.ToString”;o";Format在Azure上返回不同的字符串_C#_.net_Azure_Datetime_Iso8601 - Fatal编程技术网

C# C“DateTime.ToString”;o";Format在Azure上返回不同的字符串

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

我有一个场景,我想将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,configuredTimeZone)
语句会将UTC时间转换为您的时间(20日午夜),但由于
DateTime
不包含时区,因此它属于
DateTimeKind.Unspecified
。您的
DateTime.SpecifyKind(…,DateTimeKind.Local)
简单地告诉它是“Local”类型,对于Azure主机,是UTC+00:00


如果时区很重要,您希望使用而不是
DateTime
。它是专门为保存和操作(顾名思义)时区偏移量而构建的。

DateTime
无法存储时区。Azure中的本地时区是UTC。我正在通过TimeZoneInfo.ConvertTimeFromUtc手动提供我想要的时区,那么Azure使用UTC会如何影响转换?