【问题标题】:C# DateTime.ToString "o" Format Returns Different String on AzureC# DateTime.ToString "o" 格式在 Azure 上返回不同的字符串
【发布时间】:2017-02-22 22:39:33
【问题描述】:

我有一个场景,我想将 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,不是我想要的)。由于我手动应用我想要的时区,我不确定为什么格式会附加错误的时区信息。有没有人遇到过这种情况?

【问题讨论】:

  • DateTime 无法存储时区。
  • Azure 中的 local 时区是 UTC。
  • 我通过 TimeZoneInfo.ConvertTimeFromUtc 手动提供我想要的时区,那么 Azure 对 UTC 的使用会如何扰乱转换?

标签: c# .net azure datetime iso8601


【解决方案1】:

正如 cmets 中提到的,System.DateTime 不能存储时区。它只知道“本地”或“UTC”。托管在 Azure 中,其“本地”时间 UTC。

所以您的TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone) 声明会将UTC 时间转换为您的 时间(20 日午夜),但是因为DateTime 没有时区,所以它是DateTimeKind.Unspecified。您的 DateTime.SpecifyKind(..., DateTimeKind.Local) 只是告诉它它是“本地”类型,如果是 Azure 主机,则为 UTC+00:00。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多