[英]C# DateTime.ToString “o” Format Returns Different String on 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");
這在我的本地機器上工作正常,但我遇到了一個非常奇怪的情況,當代碼托管在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
。 它專門用於保持和操縱(顧名思義)時區偏移。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.