C#中的日期和时间转换 - DateTime.ParseExact()未按预期工作

7
我有一个日期/时间格式,例如:"1-Mar-13 92230"。根据这个文档这个链接,该格式如下:"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);

请帮忙,我对日期时间转换不太熟悉,但我看不出错在哪里。谢谢!

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

4个回答

5
你可以修复你的日期:
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”在内的所有情况。最重要的是,它非常便利,因为不需要修改源数据(例如添加空格等)。谢谢! - John

3
来自MSDN的内容:

如果格式是一个不包含日期或时间分隔符(如“yyyyMMdd HHmm”)的自定义格式模式,那么在提供程序参数中使用不变的区域设置,并使用每个自定义格式说明符的最宽形式。例如,如果您想在格式模式中指定小时数,请指定较宽的形式“HH”,而不是较窄的形式“H”。

因此,您可以尝试:
string input = "1-Mar-13 92330";
        var date = DateTime.ParseExact(input, "d-MMM-yy Hmmss", 
System.Globalization.CultureInfo.InvariantCulture);

1
这仍然会引发异常:“String was not recognized as a valid DateTime”。 - Vinay Pratap Singh Bhadauria
我支持 Rex 的评论。出于任何原因,我仍然遇到异常。 - John

1
您的输入字符串必须符合以下格式。
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);

0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接