簡體   English   中英

解析日期時間字符串返回錯誤

[英]Parsing Date Time String returns Incorrectly

我有一個Azure Web服務,可以將XML文件交付給許多客戶。

用戶將XML文件發送到Web服務,它將XML反序列化為對象,然后將其序列化為客戶所需的XML格式。

我遇到了一種奇怪的情況,其中XML文件中有兩種不同的DateTime格式被發送到Web服務,在這種情況下,XML文件中的DateTimes已輸出是不正確的。 但是,如果我在兩個單獨的文件中提供兩個DateTime,則兩個文件都將正確解析。

這是兩個日期時間:

日期= “2015-09-23T14:30:00 + 01:00”

日期= “2015-09-23T14:30:00”

在一個或另一個文件中解析時,它們都解析為14:30,這是正確的;但是,當兩種格式都在文件中時,第二個DateTime解析為15:30,第一個14:30解析。

我嘗試分配CultureInfo,設置為本地時間。

我正在使用XmlSerializer類XmlSerializer.Deserialize方法讀取發送到Web服務的XML文件到我創建的對象。

然后,我有一個簡單的映射器,它將值寫入XML並更改一些屬性和節點名稱。 將DateTime寫入字符串的代碼是:

xmlWriter.WriteAttributeString("startdatetime", dateTime.ToString("s"))

真正讓我感到困惑的是,當它們位於單獨的文件中時,所有這些都起作用,但是當它們具有兩種單獨的DateTime格式的文件中時,這一切都不起作用。

有幾件事不利於您:

  1. 您的輸入是多種多樣的。

    • "2015-09-23T14:30:00+01:00"明確是特定的時間瞬間,由日期,時間和與UTC的偏移量描述。

    • "2015-09-23T14:30:00"不提供偏移量,因此它不會直接映射到特定時間點。

  2. XmlSerializer"2015-09-23T14:30:00+01:00"反序列化為DateTime ,將應用偏移量以獲取UTC,然后將其轉換為運行該服務器的本地時區 結果具有DateTimeKind.Local

    • 在雲中,本地時區已經是UTC,因此它減去一個小時並停留在那里,盡管它仍然具有DateTimeKind.Local ,而不是DateTimeKind.Utc

    • 另請注意,您說的是15:30 ,但15:30 14:30+01:0013:30 UTC。 另外,當在一個文件中只有一個或另一個時,我看不到任何行為上的差異。 如果可以,請編輯問題以顯示以這種方式重現該問題的代碼。

  3. XmlSerializer"2015-09-23T14:30:00"反序列化為DateTime ,它將具有DateTimeKind.Unspecified 如果您打算使用它來表示UTC,那是您在事后申請的一個假設。 也可能是其他時區的本地時間。 要明確為UTC,原始字符串應為"2015-09-23T14:30:00Z""2015-09-23T14:30:00+00:00"

  4. XmlSerializer"2015-09-23T14:30:00+01:00"反序列化為DateTimeOffset ,它會阻塞。 XmlSerializer類仍然不了解DateTimeOffset的標准ISO格式。 這里有一些解決方法 ,但實際上應該在框架(IMHO)中修復。

那么該怎么辦? 好吧,最容易做的事情(以及大多數人最終要做的事情)是從這些類中刪除DateTime屬性並改為使用string 這樣,您將獲得數據中提供的確切值。 然后,您可以通過DateTime.ParseDateTimeOffset.Parse自己使用這些方法提供的所有各種選項。 有通過“聯系人屬性”的方法這樣做的例子在這個答案在這里

將兩個字符串值都轉換為DateTimeOffset ,就可以使用.DateTime屬性獲取原始提供的原始日期和時間,或者使用.UtcDateTime屬性或其他任何屬性。

請注意,如果您將不帶偏移量的ISO字符串解析為DateTimeOffset ,則會為您應用一個。 默認情況下,它將使用運行計算機的本地時區。 如果您的代碼在Azure中,則為UTC或+00:00-因此應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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