簡體   English   中英

C#DateTime.ToString“o”格式在Azure上返回不同的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM