簡體   English   中英

如何解析具有非標准格式 (yyyyMMdd:Hmm) 的日期時間?

[英]How can I parse a datetime with a nonstandard format (yyyyMMdd:Hmm)?

我們有一個集成合作伙伴堅持以yyyyMMdd:Hmm格式將日期時間作為字符串發送給我們,例如“20211029:102”。 請注意,小時沒有前導零。

我試圖像這樣解析它:

Datetime datetime = DateTime.ParseExact(
   "20211029:102", 
   "yyyyMMdd:hmm", 
   CultureInfo.InvariantCulture, 
   DateTimeStyles.None
);

但這導致

FormatException••• 字符串“20211029:102”未被識別為有效的日期時間。

我可以通過重新添加缺失的零來使其工作,例如:

string datetimeParts = "20211029:102".Split(":");
string value = datetimeParts[0] + datetimeParts[1].PadLeft(4, '0');
Datetime dt = DateTime.ParseExact(
    value, 
    "yyyyMMddHHmm", 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.None
);

但我覺得我不需要“預解析”這個值。 是否可以在不進行預處理的情況下解析這種格式?

問題出在格式字符串的時間部分,所以我的回答將解釋為什么你不能用格式字符串Hmm解析102 (我知道你寫了hmm ,但由於你沒有 AM/PM 指示符,我假設你打算寫Hmm 。同樣的推理適用於hmm 。)

如果我們查看參考源,我們可以看到 DateTime 解析器是“貪婪的”:如果解析器遇到單字母格式說明符(例如H ,它仍然會嘗試消耗 2 位數字,如果兩位數是可用

在您的情況下,有兩個數字可用,因此H將消耗10 of 102 這分鍾只剩下2 ,這與mm不匹配(因為它只有一個數字)。

鑒於此限制,無法使用 DateTime.ParseExact 解析格式為HmmDateTime.ParseExact值。 該文檔記錄了以下內容:

筆記

如果format是不包含日期或時間分隔符(例如“yyyyMMddHHmm”)的自定義格式模式,請使用不變區域性作為provider參數和每個自定義格式說明符的最寬形式。 例如,如果要在格式模式中指定小時數,請指定更寬的形式“HH”,而不是更窄的形式“H”。

暫無
暫無

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

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