[英]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.