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

时间:2010-01-13 17:04:18

标签: c# datetime

如何将以下字符串转换为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'等所以它们需要在解析之前被剥离。鲁本斯法里亚斯在下面提供了一个很好的正则表达式。

7 个答案:

答案 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)

使用转义字符处理(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);

答案 3 :(得分:2)

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

  • MO的第二 AY
  • 星期二
  • 星期三
  • ursday
  • 星期五
  • 萨图马雷的 RD AY
  • ス的第二 AY

  • 一月

  • 二月
  • 行军
  • 四月
  • 可以
  • 六月
  • 七月
  • augu的 ST
  • 九月
  • 十月
  • 十一月
  • 十二月

但是你知道那些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);