在我的网络核心项目中,我必须将字符串解析为DateTime。格式是动态的,在编译时未知。代码为:
var datetime = DateTime.ParseExact(data, format, CultureInfo.InvariantCulture, DateTimeStyles.None);
但是当格式只是小时并且以 0 到 23 的数字形式出现时,我遇到了问题。根据本文指定小时格式,您有 4 个选项:h、hh、H和HH,但在尝试解析"0"时
使用h我得到:
System.FormatException : 输入字符串的格式不正确。
使用hh我得到:
System.FormatException: 字符串未被识别为有效的日期时间。
使用H我得到:
System.FormatException : 输入字符串的格式不正确。
使用HH我得到:
System.FormatException: 字符串未被识别为有效的日期时间。
本文指出,
如果格式是不包含日期或 时间分隔符(如"yyyyMMddHHmm"),使用固定区域性 提供程序参数和每种自定义格式的最宽形式 规范。例如,如果要以以下格式指定小时数 模式,指定更宽的形式"HH",而不是较窄的形式, "H"。
但这是我一直在做的事情,并没有奏效。我无法猜测如何将一个只是小时的字符串解析为日期时间。任何想法??
编辑
执行以下任何行时都会引发异常:
DateTime.ParseExact("0", "HH", CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime.ParseExact("0", "H", CultureInfo.InvariantCulture, DateTimeStyles.None);
我不能使用TimeSpan.Parse,因为我有一个通用的解决方案来读取xlsx文件。如何读取文件存储在数据库上。有时 DateTime 都在一列中,格式为ddMMyyHHmmss
,而其他 DateTime 在一列中,格式为ddMMyy
,另一列中的小时为 0 到 23 之间的数字(分钟和秒应初始化为 0)。稍后,日期和时间将合并以返回整个日期时间。
当仅提供单个字符作为格式时,它将被解释为标准格式说明符而不是自定义格式说明符。%
字符可用于强制将其视为自定义说明符。 此处的文档中对此进行了介绍。
因此,传递"h"
,而不是传递"%h"
。 与其"H"
,不如传递"%H"
其他答案,例如这个答案,已经提到了这一点 关于使用String.Format
或ToString
的格式 ,但它也适用于ParseExact
.
或者,如果您从一些已知的DateTime
值(可能是DateTime.MinValue
,或者其他值)开始,然后使用AddHours
来获得所需的结果,您可能会发现您的代码更清晰、性能更高。 (当然,您可以先将字符串解析为整数。