【问题标题】:Date and time conversion in C# - DateTime.ParseExact() not working as expectedC# 中的日期和时间转换 - DateTime.ParseExact() 未按预期工作
【发布时间】:2013-08-22 17:23:58
【问题描述】:

我有日期/时间格式,例如: “1-Mar-13 92230” 根据this documentthis link,格式如下: “d-MMM-yy Hmmss”,因为:

Day is single digit, 1-30
Month is 3 letter abbreviation, Jan/Mar etc.
Year is 2 digits, eg 12/13
Hour is single digit for 24 hour clock, eg 9, 13 etc. (no 09)
Minute is standard (eg 01, 52)
Second is standard (eg 30, 02)

我试图在我的程序中运行以下代码,但我不断收到“字符串未被识别为有效日期时间”的错误。

string input = "1-Mar-13 92330";
        var date = DateTime.ParseExact(input, "d-MMM-yy Hmmss", 
System.Globalization.CultureInfo.CurrentCulture);

请帮忙,我对 DateTime 转换不太熟悉,但我看不出我在哪里出错了。谢谢!

更新:这是因为没有冒号就无法解析时间吗? (例如 1-Mar-13 9:22:30 被解析,但我有一个外部数据源无法从 Hmmss 重写为 H:mm:ss)

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

    你可以确定你的日期:

    var parts = "1-Mar-13 92230".Split(' ');
    
    if (parts[1].Length == 5)
    {
        parts[1] = "0" + parts[1];
    }
    
    var newDate = parts[0] + " " + parts[1];
    
    var date = DateTime.ParseExact(newDate, "d-MMM-yy HHmmss",  System.Globalization.CultureInfo.CurrentCulture);
    

    【讨论】:

    • 这对我有用。使用问题中的日期/时间和“1-Mar-13 102230”进行测试。适用于所有情况。最重要的是,只要不修改源数据(例如添加空格等),它就很方便。谢谢!
    【解决方案2】:

    来自msdn

    如果 format 是不包含日期的自定义格式模式或 时间分隔符(例如“yyyyMMdd HHmm”),使用不变的文化 对于提供者参数和每种自定义格式的最宽形式 说明符。例如,如果您想以格式指定小时数 模式,指定较宽的形式,“HH”,而不是较窄的形式, “H”。

    所以你可以试试:

    string input = "1-Mar-13 92330";
            var date = DateTime.ParseExact(input, "d-MMM-yy Hmmss", 
    System.Globalization.CultureInfo.InvariantCulture);
    

    【讨论】:

    • 这仍然给出异常“字符串未被识别为有效的日期时间”。
    • 我赞同 Rex 的评论。无论出于何种原因,我仍然得到异常
    【解决方案3】:

    您的输入字符串必须具有以下格式

    string input = "1-Mar-13 092330";
    

    如果你回到你的链接,它会说

    H   24-hour clock hour (e.g. 19)
    

    现在 H 是 24 小时,它应该用前导 0 表示。如果不能想象你将如何处理大于 9 小时的情况,即两位数。

    如果不是你的小时和分钟和秒必须分开。

    string input = "1-Mar-13 9 2330";
    
    var date = DateTime.ParseExact(input, "d-MMM-yy H mmss", 
    System.Globalization.CultureInfo.InvariantCulture);
    

    【讨论】:

      【解决方案4】:

      您的小时分钟和秒需要分开,因为它们没有被区分。

      string input = "1-Mar-13 9 23 30";
              var date = DateTime.ParseExact(input, "d-MMM-yy H mm ss",   System.Globalization.CultureInfo.CurrentCulture);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多