在我的网络核心项目中,我必须将字符串解析为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。
答案 0 :(得分:1)
当仅提供单个字符作为格式时,它将被解释为standard format specifier而不是custom format specifier。 %
字符可用于强制将其视为自定义说明符。文档here中介绍了这一点。
因此,不是传递"h"
,而是传递"%h"
。而不是"H"
,传递"%H"
this one等其他答案提到了使用String.Format
或ToString
进行格式化的问题,但它也适用于ParseExact
。
或者,如果您从一些已知的DateTime
值开始(可能是DateTime.MinValue
,或者可能是其他内容),您可能会发现您的代码更易读且更高效,然后使用AddHours
获取达到预期的效果。 (当然,您首先要将字符串解析为整数。)