使用.NET解析类似“2010年1月13日星期三”的日期

如何将以下字符串转换为System.DateTime对象?

2010年1月13日星期三
2010年1月21日星期四
2010年2月3日星期三

通常情况下会像下面这样做

DateTime dt; DateTime.TryParseExact(value, "dddd d MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt); 

但由于字符串中的’th’,’st’或’rd’,这不起作用

更新

似乎DateTime 不支持格式化 ‘th’,’st’,’rd’等因此在解析之前需要剥离它们。 鲁本斯法里亚斯在下面提供了一个很好的正则表达式。

脱掉它们怎么样?

 string value = "Wednesday 13th January 2010"; DateTime dt; DateTime.TryParseExact( Regex.Replace(value, @"(\w+ \d+)\w+ (\w+ \d+)", "$1 $2"), "dddd d MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt); 

另一种方法。

 string sDate = "Wednesday 13th January 2010"; string[] sFields = sDate.Split (' '); string day = sFields[1].Substring (0, (sFields[1].Length - 2)); DateTime date = new DateTime (sFields[3], sFields[2], day); 

使用转义字符处理( stndrdth )的另一种替代方法,在调用DateTime.TryParseExact之前不删除它们

 string dtstr = "Saturday 23rd January 2016"; DateTime dt; string[] formats = new string[] { "dddd d\\s\\t MMMM yyyy", "dddd d\\n\\d MMMM yyyy", "dddd d\\r\\d MMMM yyyy", "dddd d\\t\\h MMMM yyyy" }; bool result = DateTime.TryParseExact(dtstr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 

“th”,“st”,“nd”或“rd”在哪里出现?

  • 嘿嘿
  • 星期二
  • 星期三
  • 当天
  • 星期五
  • satu rd ay
  • su nd ay

  • 一月

  • 二月
  • 游行
  • 四月
  • 可以
  • 六月
  • 七月
  • 奥古圣路易斯
  • 九月
  • 十月
  • 十一月
  • 十二月

但是你知道那些4将始终跟一个空格。 除非我错过了一些东西,简单

 value = value.Replace("August","Augus").Replace("nd ","").Replace("st ","").Replace("nd ","").Replace("rd ","").Replace("Augus","August"); DateTime dt; DateTime.TryParseExact(value,"DDDD dd MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt); 

对我来说没有任何意义,但这对于一般的DataTime解析看起来很有趣: http : //www.codeproject.com/KB/datetime/date_time_parser_cs.aspx? msg = 3299749

我记得这篇关于使用MGrammar解析许多表达日期和时间的方法的post 。 它并不能完全回答您的问题,但它可能会成为一个有用的基础,具体取决于您的最终目标。

扩展了Kenny的方法,我添加了一些代码来将整数传递给DateTime变量……

 string sDate = "Wednesday 13th January 2010"; string[] dateSplit = sDate.Split (' '); string day = dateSplit[1].Substring(0, dateSplit[1].Length - 2); int monthInDigit = DateTime.ParseExact(dateSplit[3], "MMMM", CultureInfo.InvariantCulture).Month; DateTime date = new DateTime(Convert.ToInt16(year), monthInDigit, day);