【问题标题】:Short Time with DateTime.ParseExactDateTime.ParseExact 的短时间
【发布时间】:2015-03-10 14:19:01
【问题描述】:

我正在尝试解析时间。我已经多次看到这个问题在这里被问/回答了很多次,但不是针对这种特定情况。这是我的代码:

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

还有

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

两者都抛出相同的

“字符串未被识别为有效的日期时间”

我想要的是9:19 AM

有关更多信息,我还需要将“1305” 解析为1:05 PM,这工作正常。

在我看来,我使用了正确的格式。我忽略了什么?

【问题讨论】:

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


    【解决方案1】:

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

    理想情况下,您可以将格式更改为 HHmm - 在适当的情况下对值进行零填充 - 这样“0919”就可以很好地解析。或者,在格式中使用冒号来区分小时和分钟。我不相信有任何方法可以让DateTime 解析“919”的值,因为你想要它......所以你需要在解析之前调整字符串以某种方式。 (我们没有足够的上下文来推荐这样做的特定方式。)

    【讨论】:

    • 非常感谢所有的答案。我无法控制正在创建的文本,所以对我来说最简单的解决方案似乎是在前面添加一个零,而不是在中间添加一个冒号。变种文字=“919”; var time = DateTime.ParseExact(text.PadLeft(4, '0'), "Hmm", null);
    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      您不能将 0 前缀排除在小时之外。这行得通

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

      也许您只想在解析之前用前导零作为 3 个字符时间的前缀。

      【讨论】:

      • 可以,但前提是你有一个分隔符。问题是有两位数可以解析...
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2023-03-11
        相关资源
        最近更新 更多