DateTime.ParseExact字符串格式一直出现错误

3

我有一个DateTime的字符串表示,看起来像这样:

2011-05-25T16:42:17.156Z

我尝试了以下方法,但都没有成功:
DateTime.ParseExact(formatted, "yyyy-MM-ddThh:mm:ss.fffZ", CultureInfo.CurrentCulture);
DateTime.ParseExact(formatted, "yyyy-MM-dd hh:mm:ss.fff", CultureInfo.CurrentCulture);
DateTime.ParseExact(formatted, CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(), CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);
DateTime.ParseExact(formatted, CultureInfo.CurrentCulture.DateTimeFormat.GetAllDateTimePatterns(), CultureInfo.CurrentCulture, DateTimeStyles.None);

所有这些都会报错:
String was not recognized as a valid DateTime.

标准的DateTime.Parse似乎可以工作,但出于性能原因,我们正在探索ParseExact。这似乎应该很简单,但似乎无法使其正常工作。

1个回答

6
使用HH而不是hh来表示24小时制。应该可以这样写:
DateTime.ParseExact(formatted, "yyyy-MM-ddTHH:mm:ss.fffZ",
                    CultureInfo.CurrentCulture);

你确定要使用当前文化而不是不变文化吗?

我刚刚得出了相同的结论,并已经进行了测试。使用 HH 它可以正常工作。 - Guffa
谢谢,这解决了问题。为什么有人会选择不变文化而不是当前文化?反之亦然? - CoolUserName
2
@user90070:使用不变文化将给出相同的结果,无论当前文化是什么。日期格式中的某些分隔符取决于文化,因此可能并不适用于所有文化。另一种选择是在分隔符周围使用撇号来使格式字符串与文化无关;“yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffZ”。 - Guffa
1
指定精确的ISO 8601日期/时间格式(通过设计具有文化不变性,使用公历),然后提供区域设置似乎有点多余。但并非所有区域设置都使用公历,甚至没有每年12个月的日历:也许他们正在使用ISO 8601语法表示本地日期/时间。以色列,也许?他们每年有12或13个月。据我了解,“MM”格式说明符应该处理每年12/13个月,如果区域设置的日历支持它。 - Nicholas Carey
@Nicholas:是的,那是一种可能性 - 但我怀疑在这种情况下实际上并不需要,明确指定不变文化可以消除任何疑虑 :) - Jon Skeet

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