我想以9 October 2014 20:23:09
或9 October 2014 20:23:09 BST
(或EST
等)
protected DateTime ExtractFullDate(string date)
{
DateTime result = DateTime.MinValue;
if (!DateTime.TryParseExact(date, "d M yyyy hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
{
// Always fails and gets here
}
return result;
}
不确定格式说明符我做错了什么,但始终没有TryParseExact
。我尝试了MM
&的变体。这个月MMM
,但没有区别。
答案 0 :(得分:3)
您需要MMMM
和HH
格式字符串,如下所示:http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx。 M
适用于数字月份1-12,hh
适用于12小时制。
if (!DateTime.TryParseExact(date, "d MMMM yyyy HH:mm:ss",
CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
如果您想要时区偏移,则需要单独的解析器。 AFAIK没有像EST
这样的时区名称的格式字符串,因此您可能需要将其转换为UTC偏移量。
答案 1 :(得分:2)
使用以下格式:" d MMMM yyyy HH:mm:ss"
答案 2 :(得分:1)
您已经接受了答案,但我想添加一些其他答案中未提及的信息。它可以重复,但我想添加完整的答案。我的two cents:
来自DateTime.TryParseExact
method
将指定的日期和时间字符串表示形式转换为它 DateTime等效。 字符串表示的格式必须 完全匹配指定的格式。
当我们查看您的格式时,"M"
format specifier会将您的月份表示为1
到12
之间的数字。但是您使用月份作为月份的全名,符合"MMMM"
format specifier。
"hh"
format specifier 12小时制,即01到12
。但是您使用20
作为 24小时制的小时。这就是为什么它适合00
到23
的{{3}}。
string s = "9 October 2014 20:23:09";
DateTime date;
if(DateTime.TryParseExact(s, "d MMMM yyyy HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
// Successful parse
}
让我们看一下解析时区缩写名称。此名称没有自定义日期和时间格式字符串标准。
为什么?
我对此没有完美的答案。但我有一个答案,为什么不应该有任何格式。
.NET Framework不支持时区的名称,因为它们不是唯一的。世界上不同的时区可以使用相同的缩写名称。
例如CST
可以表示3个不同的时区;
"HH"
format specifier即UTC + 8小时那么,如何解析"9 October 2014 20:23:09 CST"
字符串? .NET Framework如何知道哪个时区信息包含此字符串?
我在互联网上看到一些关于这个主题的文章,一个选项(不是一个好方法)可以使用这个时区缩写名称部分作为Cuba Standard Time并使用另一个literal string delimiter,其格式为一个字符串数组。
string s = "9 October 2014 20:23:09 BST";
string[] formats =
{
"d MMMM yyyy HH:mm:ss 'BST'",
"d MMMM yyyy HH:mm:ss 'EST'"
};
DateTime date;
if(DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
//
}