将这种字符串解析为DateTime "Friday 22nd March 2013"(c#)

本文关键字:quot March 22nd 2013 Friday DateTime 字符串 | 更新日期: 2023-09-27 18:04:53

我有一大块文字,像这样:

…建议2013年3月22日星期五有可能被宣布为一天.....

我必须在其中找到并解析DateTime(2013年3月22日星期五)。我可以找到它并使用DateTime。尝试parse获取几乎所有内容,但是序数后缀(st,nd,rd,th)让我迷惑不解。

当我在调用TryParse方法之前构造格式字符串时,是否有任何通配符可以用来考虑这些后缀?还有其他建议吗?

谢谢!

将这种字符串解析为DateTime "Friday 22nd March 2013"(c#)

如何使用regex替换不需要的字符?

作为一个例子,下面的正则表达式应该完成这项工作:"(?<='d)[a-z]{2}" .

示例代码

string date = "Friday 22nd March 2013";
var r = new Regex(@"(?<='d)[a-z]{2}");
String result = r.Replace(date, "");
Console.WriteLine(DateTime.Parse(result, CultureInfo.InvariantCulture));
输出:

22/03/2013 00:00:00

这应该可以处理大多数情况,但要确保正确测试。

你可以使用蛮力。

注意:我将借用一些富士的代码,所以我们有相同的外观和感觉。

string date = "Friday 22nd March 2013";
string[] split = date.Split(' ');
string dayOfWeek = split[0]; // throw away & don't need
int day = Convert.ToInt32(split[1].SubString(0, split[1].Length - 2);
int month = 0;
switch (split[2]) {
  case "January": month = 1; break;
  case "February": month = 2; break;
  case "March": month = 3; break;
  case "April": month = 4; break;
  case "May": month = 5; break;
  case "June": month = 6; break;
  case "July": month = 7; break;
  case "August": month = 8; break;
  case "September": month = 9; break;
  case "October": month = 10; break;
  case "November": month = 11; break;
  case "December": month = 12; break;
}
int year = Convert.ToInt32(split[3]);
var dateTime = new DateTime(year, month, day);
Console.WriteLine(dateTime);

不是100%,我得到了"新的DateTime"构造函数正确。我现在没有运行IDE

DateTime.Parse有一个允许多种格式字符串的过载-您可以将序号作为文字字符串传递,就像这个助手方法(使用线程区域设置来计算月/日名称拼写):

private static DateTime ParseOrdinalDateTime(string dt)
{
    string[] expectedFormats = new[] {
                                        "dddd d'st' MMMM yyyy",
                                        "dddd d'nd' MMMM yyyy",
                                        "dddd d'rd' MMMM yyyy",
                                        "dddd d'th' MMMM yyyy"
                                      };
    return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None);
}