使用.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);
使用转义字符处理( st
, nd
, rd
和th
)的另一种替代方法,在调用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);