如何将以下字符串转换为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 doesn't support formatting是'th','st','rd'等所以它们需要在解析之前被剥离。鲁本斯法里亚斯在下面提供了一个很好的正则表达式。
答案 0 :(得分:15)
剥去它们怎么样?
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);
答案 1 :(得分:4)
另一种方法。
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);
答案 2 :(得分:3)
使用转义字符处理(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);
答案 3 :(得分:2)
“th”,“st”,“nd”或“rd”在哪里出现?
ス的第二强> 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);
答案 4 :(得分:0)
对我来说没有任何意义,但这对于一般的DateTime解析看起来很有趣:{{3p>
答案 5 :(得分:0)
我记得this post on using MGrammar解析了很多不同的方式来表达日期和时间。它并没有完全回答你的问题,但它可以作为一个有用的基础,取决于你的最终目标。
答案 6 :(得分:0)
扩展了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);