【问题标题】:DateTime.ParseExact using just hour format not workingDateTime.ParseExact 仅使用小时格式不起作用
【发布时间】:2018-05-16 20:41:18
【问题描述】:

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

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

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

使用 h 我得到:

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

使用 hh 我得到:

System.FormatException:字符串未被识别为有效的 DateTime。

使用 H 我得到:

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

使用 HH 我得到:

System.FormatException:字符串未被识别为有效的 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 ,而其他 DateTime 在一列中,格式为 ddMMyy ,而小时在其他列中,为 0 到 23 之间的数字(分钟和秒应初始化为 0 )。稍后将日期和小时合并以返回整个 DateTime。

【问题讨论】:

  • 如果您只有时间,日期会是什么时候,会是 1.1.0001 吗?
  • 在这种情况下,白天部分将被忽略,所以它是一样的。
  • 可能你已经检查过了,但无论如何:stackoverflow.com/questions/34321486/…
  • 另外,您是否可以选择检查您拥有的值并填充它,以便它适合正确的格式,例如如果 string.Length == 1 或 2...string = string + ":00".
  • 不幸的是,DateTime.ParseExact 不处理 all 格式组合,并且不处理仅包含 1 个数字(表示小时)的字符串。最可能的原因是“没有人”会要求DateTime.ParseExact 解析不是日期、时间或组合的东西,而"23" 两者都不是。

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


【解决方案1】:

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

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

其他答案,例如this one,在使用String.FormatToString 进行格式化时已经提到了这一点,但它也适用于ParseExact

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

【讨论】:

  • 我不知道标准格式说明符和服装格式说明符之间的区别。你的回答解决了我的问题。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多