繁体   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