Nat*_*n G 4 .net c# datetime iso8601 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");
Run Code Online (Sandbox Code Playgroud)
这在我的本地机器上运行良好,但我遇到了一个非常奇怪的情况,当代码托管在 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)
只需告诉它它是“本地”类型,如果是 Azure 主机,则为 UTC+00:00。
如果时区很重要,您希望使用System.DateTimeOffset而不是DateTime
. 它专为保存和操作(顾名思义)时区偏移而构建。
归档时间: |
|
查看次数: |
7459 次 |
最近记录: |