我有一大堆这样的文字:
....建议 2013 年 3 月 22 日星期五有可能被宣布为一天......
我必须在其中找到并解析 DateTime(2013 年 3 月 22 日星期五)。我可以找到它并使用 DateTime.TryParse 来获取几乎所有内容,但是序数后缀 (st,nd,rd,th) 让我失望。
当我在调用 TryParse 方法之前构造格式字符串时,是否有任何通配符可以用来考虑这些后缀?或者有什么其他建议?
谢谢!
我有一大堆这样的文字:
....建议 2013 年 3 月 22 日星期五有可能被宣布为一天......
我必须在其中找到并解析 DateTime(2013 年 3 月 22 日星期五)。我可以找到它并使用 DateTime.TryParse 来获取几乎所有内容,但是序数后缀 (st,nd,rd,th) 让我失望。
当我在调用 TryParse 方法之前构造格式字符串时,是否有任何通配符可以用来考虑这些后缀?或者有什么其他建议?
谢谢!
使用 替换不需要的字符怎么样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
这应该处理大多数情况,但请确保正确测试它。
你总是可以蛮力它。
注意:我将借用 Fuji 的一些代码,以便我们拥有相同的外观和感觉。
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% 我得到了正确的“新日期时间”构造函数。我现在没有运行我的 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);
}