C# DateTime.ToString "o" 格式 Returns Azure 上的不同字符串
C# DateTime.ToString "o" Format Returns Different String on Azure
我有一个场景,我想将 UTC 日期转换为具有特定时区的 ISO 8601 字符串,以便通过网络发送 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
无法存储时区。它只知道 "local" 或 "UTC"。托管在 Azure 中,其 "local" 时间 是 UTC。
所以你的 TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone)
语句会将 UTC 时间转换为 你的 时间(20 日午夜),但是因为 DateTime
没有时区,它属于 DateTimeKind.Unspecified
。您的 DateTime.SpecifyKind(..., DateTimeKind.Local)
只是告诉它它是 "local" 类型,对于 Azure 主机,UTC+00:00.
如果时区很重要,您希望使用 System.DateTimeOffset 而不是 DateTime
。它专门用于保存和操纵(顾名思义)时区偏移量。
我有一个场景,我想将 UTC 日期转换为具有特定时区的 ISO 8601 字符串,以便通过网络发送 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
无法存储时区。它只知道 "local" 或 "UTC"。托管在 Azure 中,其 "local" 时间 是 UTC。
所以你的 TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone)
语句会将 UTC 时间转换为 你的 时间(20 日午夜),但是因为 DateTime
没有时区,它属于 DateTimeKind.Unspecified
。您的 DateTime.SpecifyKind(..., DateTimeKind.Local)
只是告诉它它是 "local" 类型,对于 Azure 主机,UTC+00:00.
如果时区很重要,您希望使用 System.DateTimeOffset 而不是 DateTime
。它专门用于保存和操纵(顾名思义)时区偏移量。