![](/img/trans.png)
[英]How to parse a string to DateTime with “yyyyMMdd Hmm” format?
[英]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 解析格式为Hmm
的DateTime.ParseExact
值。 该文档记录了以下内容:
笔记
如果
format
是不包含日期或时间分隔符(例如“yyyyMMddHHmm”)的自定义格式模式,请使用不变区域性作为provider
参数和每个自定义格式说明符的最宽形式。 例如,如果要在格式模式中指定小时数,请指定更宽的形式“HH”,而不是更窄的形式“H”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.