繁体   English   中英

如何从字符串解析日期?

[英]How to parse date from string?

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

现在要匹配日期,我们可以使用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页面解析的,字符串可以是任何其他字符串。

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

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

如果仅英语,且格式为“ MMM dd yyyy”,则可以搜索您的字符串在[January | February | ... | December]日年的位置。

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

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

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}(1月| 2月| 3月| 4月| 5月| 6月| 7月| 4月| 9月| 10月| 11月| 12月)\\ s {1} \\ d {4} $

由Stephen Lam从http://regexlib.com/REDetails.aspx?regexp_id=325

或者,您可以浏览此站点以找到适当的表达。

如果您知道日期将以一个月开始,则可以使用子字符串来获取该部分。 (发现1月/ 2月/等发生)

我认为\\w{3,8} \\d\\d \\d\\d\\d\\d[\\s$]之类的东西在大多数情况下都可以使用美国格式,但如果这样,我不会太信任它您要解析的文本可以是任何内容。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM