无法使用Datetime.ParseExact将日期时间字符串转换为日期时间类型

4

这是我拥有的确切字符串:18-2-2014 00:00:00

我的代码遇到了以下错误:

未处理的异常类型 'System.FormatException' 在 mscorlib.dll 中发生

额外的信息:字符串未被识别为有效的 DateTime。

此行代码出错:

newDateTime = DateTime.ParseExact(
                        part[0],
                        "dd-mm-jjjj hh:mm:ss", 
                        CultureInfo.InvariantCulture
                        ); //I tried a couple of time string variations, but it should be the above or "dd-m-jjjj hh:mm:ss".

我做错了什么?


4
天啊,我真的在那儿写了“jjjj”……该死的 Excel。那是荷兰授权的 Excel :/。 - Madmenyo
如果你看一下DateTime String Formats,你就会发现没有jjjj这个格式。 - Jonesopolis
是啊,我怎么能够一遍又一遍地忽略那个...可能是因为我在工作中使用了荷兰语版的Excel整天都用那个字符串格式。这里的dd是相同的,mm除了yyyy以外也是相同的,这里是jjjj... - Madmenyo
1
别担心,在丹麦语中,“year”是“åååå”。 - Jeppe Stig Nielsen
2个回答

3

mm specifier 是代表分钟。使用 M specifier 代表月份(112)。

hh 格式是代表 011212小时制)。它没有 00 作为小时数。因此,您应该使用 HH 格式,该格式适用于 002324小时制)。

目前没有 jjjj 这个日期和时间格式说明符,我认为你想使用 yyyy 格式。

var s = "18-2-2014 00:00:00";
var date = DateTime.ParseExact(s,
                              "dd-M-yyyy HH:mm:ss",
                               CultureInfo.InvariantCulture);
Console.WriteLine(date);

输出将是:

2/18/2014 12:00:00 AM

这里有一个demonstration

想要更多信息,请查看;

注意: 正如Jeppe Stig Nielsen所指出的,因为我们不确定您的文化背景(可能是nl-BEnl-NL),您的ShortDatePattern日期格式中的天数为d而不是dd

这就是为什么您可能需要使用d格式而不是dd的原因。


同时,在12小时制中,小时数00是无效的(必须在0112之间),这就是为什么你将hh改为HH(从0023)。 - Jeppe Stig Nielsen
我们无法从他的输入中确定(它不是月份的前九天之一),但我确信"d-M-yyyy"更符合他的需求,而不是"dd-M-yyyy"。请参考(new CultureInfo("nl-NL")).DateTimeFormat.ShortDatePattern - Jeppe Stig Nielsen
谢谢,这是非常详细的解释。我的文化背景是荷兰语(nl-NL),您能否更深入地解释一下?就像@JeppeStigNielsen的评论一样? - Madmenyo
@JeppeStigNielsen 你说得很有道理。它可能是 nl-BEnl-NL,但两者的 ShortDatePattern 都使用 d 格式而不是 dd。我已经在我的答案中添加了这个信息。谢谢。 - Soner Gönül

-1

试试这个:

newDateTime = DateTime.ParseExact(part[0],"dd-M-yyyy HH:mm:ss", 
                    CultureInfo.InvariantCulture);

5
我猜测OP真正想要的是HH而不是hh。 - Jon Skeet

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