【问题标题】:How can a string timestamp with hours 0 to 24 be parsed如何解析小时 0 到 24 的字符串时间戳
【发布时间】:2012-09-04 21:07:41
【问题描述】:

我正在尝试使用DateTime.ParseExact() 解析格式为"yyyyMMddHHmmss" 的字符串时间戳。问题是我必须允许“24”的小时值(即小时可以从 0 到 24,其中 24 小时表示第二天的 0 小时(天 + 1,小时 = 0)注意:我无法控制输入值。)当然,这会导致异常。
是否有任何设置/属性我可以设置而不是手动解析/使用正则表达式?如果没有,有什么有效的解析思路吗?

例如

DateTime.ParseExact("20120911240000", "yyyyMMddHHmmss", 
   System.Globalization.CultureInfo.InvariantCulture);

【问题讨论】:

  • 24 小时是什么意思? 0 小时是午夜,第二天 24 小时也是午夜?
  • Parse C# string to DateTime 的可能重复项
  • @HenkHolterman 我讨厌人们在实际阅读问题之前说“可能重复”
  • 添加示例,并更正日期/时间格式字符串
  • 第 24 小时表示第二天的第 0 小时(所以天 + 1,小时 = 0)

标签: c# .net datetime


【解决方案1】:

如果您想手动执行此操作,您可以使用String.Substring() 检测“24”小时值,然后使用String.Replace 将其设置为“00”,然后解析您的日期,然后添加一天如果这就是“24”小时值的含义

【讨论】:

  • 谢谢,我想过这个问题,但目标时间似乎有点混乱。
【解决方案2】:

没有简单的标志可以做你想做的事。

但是,这里是创建自定义日期时间解析器的方法:

How to create and use a custom IFormatProvider for DateTime?

【讨论】:

    【解决方案3】:

    Sam 的解决方案很好,但由于您使用的是 yyyyMMddHHmmss,我会这样做:

    bool addDay = false;
    DateTime result;
    string dtToParse = "20120911240000";
    
    if (dtToParse[8] == '2' && dtToParse[9] == '4')
    {
        dtToParse = dtToParse.Substring(0, 8) + "00" + dtToParse.Substring(10);
        addDay = true;
    }
    
    result = DateTime.ParseExact(dtToParse, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
    
    if (addDay) { result = result.AddDays(1); }
    

    【讨论】:

    • @user897052 我在你的修复中添加了。我没有实际测试它,因此问题很简单。如果这解决了您的问题,请将其标记为答案。
    • 不用担心,这是一个很好的例子;谢谢
      @Sam 我和 Trisped:我暂时使用了类似的代码作为解决方案。我的下一个目标是使用更健壮/动态的东西,也许像 Victor Ronin 建议的那样使用自定义 IFormatProvider。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多