DateTime.ParseExact 仅使用小时格式不起作用



在我的网络核心项目中,我必须将字符串解析为DateTime。格式是动态的,在编译时未知。代码为:

var datetime = DateTime.ParseExact(data, format, CultureInfo.InvariantCulture, DateTimeStyles.None);

但是当格式只是小时并且以 0 到 23 的数字形式出现时,我遇到了问题。根据本文指定小时格式,您有 4 个选项:hhhHHH,但在尝试解析"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.FormatToString的格式 ,但它也适用于ParseExact.

或者,如果您从一些已知的DateTime值(可能是DateTime.MinValue,或者其他值)开始,然后使用AddHours来获得所需的结果,您可能会发现您的代码更清晰、性能更高。 (当然,您可以先将字符串解析为整数。

最新更新