使用DateTime.ParseExact的短时间

时间:2015-03-10 14:19:02

标签: c# asp.net .net parsing datetime

我正在尝试解析时间。我已经多次看到这个问题/答案,但不是针对这个具体情况。这是我的代码:

var time1 = DateTime.ParseExact("919", "Hmm", CultureInfo.InvariantCulture);

var time2 = DateTime.ParseExact("919", "Hmm", null);

这两个都是相同的

  

" String未被识别为有效的DateTime"

我想要的是9:19 AM

有关详细信息,我还需要将“1305”解析为1:05 PM,这很正常。

在我看来,我正在使用正确的格式。我在俯瞰什么?

4 个答案:

答案 0 :(得分:10)

我不确定可以处理此问题的任何格式。问题在于" H"可以是一个数字或两个数字,所以如果有两个数字可用,它将同时抓取 - 在这种情况下将其解析为小时91,这显然是无效的。

理想情况下,您可以将格式更改为HHmm - 在适当的位置对值进行零填充 - 因此" 0919"会解析好。或者,使用格式的冒号来区分小时和分钟。我不相信有任何办法可以DateTime解析" 919"如你所愿......所以你需要在解析它之前调整字符串以某种方式。 (我们没有足够的背景来推荐一种特定的方式。)

答案 1 :(得分:2)

是的,您的格式是正确的,但由于H specifier 可能2字符,ParseExact方法会尝试将91解析为一小时,这是一个无效的小时,这就是为什么你在这两种情况下得到FormatException

4个月前,我联系了微软团队了解这种情况。看一看;

他们建议在字符串中使用2位数字形式或在它们之间插入日期分隔符。

var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);

var time1 = DateTime.ParseExact("9:19", "H:mm", CultureInfo.InvariantCulture);

答案 2 :(得分:0)

您无法将0前缀排除在小时之外。这工作

var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);

也许你想在解析之前只用前导零的3个字符前缀。

答案 3 :(得分:0)

非常感谢所有答案。我无法控制正在创建的文本,所以对我来说最简单的解决方案似乎是前缀为零,而不是在中间添加冒号。

var text = "919";

var time = DateTime.ParseExact(text.PadLeft(4, '0'), "Hmm", null);