【问题标题】:How to parse date from string?如何从字符串中解析日期?
【发布时间】:2010-05-10 07:56:19
【问题描述】:

我想从字符串中解析日期,其中日期格式可以是任何不同的格式。

现在要匹配日期,我们可以使用DateTime.TryParseExact,我们可以根据需要定义格式,并且日期将匹配任何不同的格式。

string[] formats = {"MMM dd yyyy"};

            DateTime dateValue;
            string dateString = "May 26 2008";

            if (DateTime.TryParseExact(dateString, formats,
                                           new CultureInfo("en-US"),
                                           DateTimeStyles.None,
                                           out dateValue))

                    MessageBox.Show(dateValue.ToString());

这与日期匹配。但这不适用于从与某些字符串中的日期不匹配的字符串中解析日期。

喜欢 如果日期是"May 26 2008",那么我们可以定义格式"MMM dd yyyy",并且日期将被匹配。

但是如果日期在"Abc May 26 2008"这样的字符串中,那么日期将不会被匹配。那么我们可以在这里使用正则表达式吗?如果是怎么办?

我要解析日期的字符串,是从html页面解析出来的,字符串可以不一样。

编辑:我想使用正则表达式编写与任何有日期的字符串匹配的格式。

【问题讨论】:

  • 日期在字符串中的位置是否固定(比如在末尾或在某个字符数处)?
  • 不,不是,日期可以在字符串中的任何位置,实际上我正在从 html 页面解析字符串,然后检查字符串中是否有日期,如果是,然后从字符串中解析日期。

标签: c# winforms parsing date


【解决方案1】:

您可以对@"[A-Za-z]{3} \d{2} \d{4}" 之类的内容进行正则表达式匹配,并将匹配的内容输入DateTime.TryParseExact。它可能会因其他文化而中断,但是我不确定周围是否有语言的月份名称只有 2 个字母短之类的:)

或者,您可以从cultureInfo.DateTimeFormat.AbbreviatedMonthNames 中提取月份名称,并使用它来构建一个更好的目标正则表达式。它也应该适用于其他文化。

编辑 - 这是一个例子:

string text = "Apr 03 2010 foo May 27 2008 bar";
CultureInfo ci = new CultureInfo("en-US");
Regex regex = new Regex(@"(?<date>(" + String.Join("|",
    ci.DateTimeFormat.AbbreviatedMonthNames, 0, 12) + @") \d{2} \d{4})");

// Builds this regex:
// (?<date>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4})

var matches = regex.Matches(text);
foreach (Match match in matches)
{
    string capturedText = match.Groups["date"].Value;
    DateTime dt;
    if (DateTime.TryParseExact(capturedText, "MMM dd yyyy", ci,
        DateTimeStyles.None, out dt))
    {
        Console.WriteLine(capturedText + ": " + dt.ToLongDateString());
    }
}

// Prints two parsed dates in long format

【讨论】:

  • @Thorarin,我不明白。
  • @Harikrishna:这是一个工作示例。稍微修改了代码,因为显然月份数组包含 13 个元素。示例仅适用于公历。
  • @Harikrishna:我不确定您在寻找什么,但该输入不符合您在TryParseExact 语句中提供的模式。因此,它不适用于这种类型的输入。
  • @Thorarin,我想为不同的日期定义多种格式以匹配多种日期格式。
  • @Harikrishna:您也可以扩展正则表达式以包含这些格式,但我猜不出您对哪些格式感兴趣。没有(理智的)解决方案适用于所有格式一次,因此您只需阅读正则表达式语法:) TryParseExact 允许您提供可识别格式的数组,或者您可以使用 DateTime.TryParse 代替。
【解决方案2】:

如果它只是英文并且格式是“MMM dd yyyy”,你可以搜索你的字符串是 [January|February|...|December] 年。

但是您应该首先问自己为什么要解析任何字符串。您不能强制用户使用预定义的格式并验证该输入吗?

【讨论】:

  • 不是这样的。我正在解析 html 页面以在 datagridview 中显示一些有用的信息。为此,我将检查 html 页面中的每个表,并在每个表中检查每一行,并且对于每一个我检查 columninnertext 中的每个 columninnertext 日期,columninnertext 和 columninnertext 可以是任何字符串。
【解决方案3】:

您可以根据需要自定义格式:

private const string DateTimeFormat = "dd-MMM-yy hh.mm.ss.ffffff tt"; 

public static bool TryParseToDateTime(this string stringValue, out DateTime result)
{
    if (String.IsNullOrEmpty(stringValue))
    {
        result = DateTime.MinValue;
        return false;
    }

    return DateTime.TryParseExact(stringValue, DateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);
}

更新: 您可能应该使用正则表达式来查找与文本中的日期匹配的字符串。您必须确定您期望的日期格式并编写(或选择)适当的正则表达式。例如,对于“dd MMM yyyy”格式,您可以使用以下正则表达式:

^\d{2}\s{1}(一月|二月|三月|四月|五月|六月|七月|四月|九月|十月|十一月|十二月)\s{1}\d{4}$

斯蒂芬·林来自http://regexlib.com/REDetails.aspx?regexp_id=325

您也可以浏览this site 以找到合适的表达方式。

【讨论】:

  • @Boris,字符串不固定,可以是任何类型的字符串。
  • Harikrishna,你想如何解析“1/3/10”?可能是 2010 年 3 月 1 日或 2010 年 1 月 3 日或其他日期?您必须定义所需的格式并使用正则表达式在文本中查找匹配项
  • @Boris,只有一种格式是 01/03/2010。但如果日期在任何字符串中,则应该匹配。
  • @Boris,在为 tryparse 方法编写格式时,我们无法制作匹配任何类型字符串的正则表达式。
  • @Harikrishna,对不起,“01/03/2010”不是一种格式。格式为“dd/MM/yyyy”或“MM/dd/yyyy”。我不确定我是否正确理解了您的要求。您说您需要支持一种格式,但您在上面评论说您“想要定义一种以上的格式”。您能否说明您的要求是什么?
【解决方案4】:

如果您知道您的日期将从一个月开始,那么您可以使用子字符串来获取该部分。 (查找一月/二月/等的发生)

【讨论】:

    【解决方案5】:

    我认为像\w{3,8} \d\d \d\d\d\d[\s$] 这样的东西如果是美国格式的话大部分时间都可以工作,但如果你正在解析的文本可以是任何东西,我不会太相信它。

    【讨论】:

      【解决方案6】:

      这是从字符串中解析日期的链接,非常好。有一组正则表达式可以从字符串中解析日期。

      http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 2011-04-16
        • 2013-10-05
        • 2013-07-06
        • 1970-01-01
        相关资源
        最近更新 更多