如何用非标准格式(yyyyMMdd:Hmm)解析日期时间?



我们有一个集成合作伙伴,他坚持将日期时间作为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
);

但是我觉得我不需要"准备"。值。是否有可能在没有预处理的情况下解析这种格式?

问题在于时间格式字符串的一部分,所以我的答案将解释你为什么不能解析与格式字符串Hmm102(我知道你写的是hmm,但是因为你没有AM/PM指示器,我假设你的意思是写Hmm。同样的推理也适用于hmm)

如果我们查看参考源代码,我们可以看到DateTime解析器是"贪婪的":如果解析器遇到单字母格式说明符(例如H),它仍然会尝试使用2位数,如果有2位数可用。

在你的例子中,两位数字所以H将消耗10210。这只剩下2,它不会匹配mm(因为它只有一个数字)。

考虑到这个限制,不可能用DateTime.ParseExact解析格式化为Hmm的DateTime值。文档说明如下:

注意

如果format是自定义格式模式,不包含日期或时间分隔符(如"yyyyMMddHHmm"),则对provider参数使用不变区域性和每个自定义格式说明符的最宽形式。例如,如果您想在格式模式中指定小时,请指定较宽的格式"H",而不是较窄的格式"H"

最新更新