仅使用小时格式的DateTime.ParseExact

时间:2018-05-16 20:41:19

标签: c# .net datetime .net-core

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

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

但是我遇到的问题是格式只是小时,而是从0到23的数字。根据this文章指定小时格式,你有4个选项: h hh H HH ,但在尝试解析“0”时

使用 h 我得到:

  

System.FormatException:输入字符串的格式不正确。

使用 hh 我得到:

  

System.FormatException:String未被识别为有效的DateTime。

使用 H 我得到:

  

System.FormatException:输入字符串的格式不正确。

使用 HH 我得到:

  

System.FormatException:String未被识别为有效的DateTime。

this文章中声明

  

如果format是自定义格式模式,不包含日期或   时间分隔符(例如“yyyyMMddHHmm”),使用不变的文化   提供者参数和每种自定义格式的最宽格式   符。例如,如果要以格式指定小时数   模式,指定更宽的形式,“HH”,而不是更窄的形式,   “H”。

但这是我一直在做的事情并没有奏效。我无法猜测如何实现解析一个只是进入DateTime的小时的字符串。任何想法??

修改

执行以下任何一行时抛出异常:

DateTime.ParseExact("0", "HH", CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime.ParseExact("0", "H", CultureInfo.InvariantCulture, DateTimeStyles.None);

我无法使用TimeSpan.Parse,因为我有一个读取 xlsx 文件的通用解决方案。如何读取文件存储在数据库中。有时,DateTime全部在一列中,格式为ddMMyyHHmmss,其他日期时间在一列中,格式为ddMMyy,其他小时在另一列中为0到23之间的数字(分钟和秒应该是用0)初始化。稍后合并日期和小时以返回整个DateTime。

1 个答案:

答案 0 :(得分:1)

当仅提供单个字符作为格式时,它将被解释为standard format specifier而不是custom format specifier%字符可用于强制将其视为自定义说明符。文档here中介绍了这一点。

因此,不是传递"h",而是传递"%h"。而不是"H",传递"%H"

this one等其他答案提到了使用String.FormatToString进行格式化的问题,但它也适用于ParseExact

或者,如果您从一些已知的DateTime值开始(可能是DateTime.MinValue,或者可能是其他内容),您可能会发现您的代码更易读且更高效,然后使用AddHours获取达到预期的效果。 (当然,您首先要将字符串解析为整数。)