如何解析日期,例如" 2014年10月9日20:23:09 BST"

时间:2014-10-09 19:35:34

标签: c# .net datetime datetime-format

我想以9 October 2014 20:23:099 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,但没有区别。

3 个答案:

答案 0 :(得分:3)

您需要MMMMHH格式字符串,如下所示:http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspxM适用于数字月份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会将您的月份表示为112之间的数字。但是您使用月份作为月份的全名,符合"MMMM" format specifier

"hh" format specifier 12小时制,即01到12。但是您使用20作为 24小时制的小时。这就是为什么它适合0023的{​​{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个不同的时区;

那么,如何解析"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))
{
    //
}