如何从字符串中解析日期?

时间:2010-05-10 07:56:19

标签: c# winforms parsing date

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

现在为了匹配日期,我们可以使用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());

这与date匹配。但这不能解析字符串中的日期,因为它与某些字符串中的日期不匹配。

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

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

我要解析日期的字符串,从html页面解析,字符串可以是任何不同的。

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

6 个答案:

答案 0 :(得分:3)

您可以对@"[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

答案 1 :(得分:1)

如果它只是英文版,格式为“MMM dd yyyy”,你可以搜索你的字符串[1月| 2月| ... | 12月]日的位置。

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

答案 2 :(得分:1)

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

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}(一月| 2月| 3月|四月|五月|六月|七月|四月|九月|十月| 11月|十二月)\ S {1} \ d {4} $

来自http://regexlib.com/REDetails.aspx?regexp_id=325

的Stephen Lam

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我觉得像\w{3,8} \d\d \d\d\d\d[\s$]这样的东西大部分时间都会起作用,如果它是美国格式的,但是如果您正在解析的文本可能只是任何东西,我不会太相信它。

答案 5 :(得分:0)

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

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