【问题标题】:How to parse a date like "9 October 2014 20:23:09 BST"如何解析像“2014 年 10 月 9 日 20:23:09 BST”这样的日期
【发布时间】:2014-10-09 19:35:33
【问题描述】:

我想解析从网页收到的日期,格式为 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 失败。我在这个月尝试了MMMMM 的变体,但没有区别。

【问题讨论】:

  • 我不认为 DateTime 可以解析时区缩写。您可能需要用偏移量替换它们,例如 date = date.Replace("EST", "+07");
  • 您可以将literal string delimiter 用于您的BSTEST 部分。但在这种情况下,您需要使用其他 DateTime.TryParseExact 重载,它将格式作为字符串数组。
  • @Soner Gönül:这确实很好地解决了最终问题。多个格式字符串的数组可以解决这个问题。随意列出支持的扩展答案。

标签: c# .net datetime datetime-format


【解决方案1】:

您需要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 偏移量。

【讨论】:

    【解决方案2】:

    使用这种格式:“d MMMM yyyy HH:mm:ss”

    【讨论】:

    • Argh...实际上是HH 我错了!我已经尝试过MMMM 干得好。
    【解决方案3】:

    您已经接受了一个答案,但我想添加一些其他答案中未提及的信息。它可以是重复的,但我想添加完整的答案。这是我的two cents

    来自DateTime.TryParseExact method

    将日期和时间的指定字符串表示形式转换为其 日期时间等效。 字符串表示的格式必须 完全匹配指定的格式。

    当我们查看您的格式时,"M" format specifier 将您的月份表示为从 112 的数字。但是你使用你的月份作为月份的全名,它符合"MMMM" format specifier

    "hh" format specifier 表示 12 小时制,即 01 到 12。但是您使用20 作为一个小时,即24 小时制。这就是为什么它适合"HH" format specifier,即0023

    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 如何知道哪些时区信息包含该字符串?

    我在互联网上看到了一些关于这个主题的文章,一个选项(不是一个好方法)可以使用这个时区缩写名称部分作为 literal string delimiter 并使用另一个 DateTime.TryParseExact overload 将格式作为字符串数组。

    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))
    {
        //
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2019-06-15
      • 2022-10-14
      • 2021-07-05
      • 2014-12-19
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多