我们有一个集成合作伙伴,他坚持将日期时间作为yyyyMMdd:Hmm
格式的字符串发送给我们,例如"20211029:102"。请注意,小时没有前导零。
我试着这样解析它:
Datetime datetime = DateTime.ParseExact(
"20211029:102",
"yyyyMMdd:hmm",
CultureInfo.InvariantCulture,
DateTimeStyles.None
);
但是结果是
FormatException•••字符串"20211029:102"是不被认为是有效的DateTime。
我可以通过重新添加缺失的零来使它工作,例如:
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位数,如果有2位数可用。
在你的例子中,两位数字是所以H
将消耗102
的10
。这只剩下2
,它不会匹配mm
(因为它只有一个数字)。
考虑到这个限制,不可能用DateTime.ParseExact
解析格式化为Hmm
的DateTime值。文档说明如下:
注意
如果
format
是自定义格式模式,不包含日期或时间分隔符(如"yyyyMMddHHmm"),则对provider
参数使用不变区域性和每个自定义格式说明符的最宽形式。例如,如果您想在格式模式中指定小时,请指定较宽的格式"H",而不是较窄的格式"H"