如何在月份的日期解析带有后缀“th”,“st”或“nd”的日期?

我在使用DateTime.Parse遇到了麻烦

我正在处理各种格式的日期,其中一些格式为January 11thFebruary 22nd ,依此类推。

DateTime.Parse尝试解析这些DateTime.Parse抛出exception。

我想知道在DateTime中是否存在我缺少的内置function,就像我可以设置的标志,这将使Parse以更可接受的方式运行。

我知道这可用一个相对简单的正则表达式解决,而且我已经有一个模糊匹配我写的日期的类,但是我想知道是否有内置的方法来执行这种提取,因为它将从长远来看,比重新发明轮子更容易维护。

.Net框架中没有内置任何内容来解析January 11th or February 22nd等格式的日期。您必须删除后缀字符,然后才能使用DateTime.TryParseExact

对于带有后缀stth日期,您可以使用string.Replace删除该部分,然后使用DateTime.TryParseExact 。 喜欢。

 string str = "1st February 2013"; DateTime dtObject; string replacedStr = str.Substring(0,4) .Replace("nd","") .Replace("th","") .Replace("rd","") .Replace("st","") + str.Substring(4); if (DateTime.TryParseExact(replacedStr, "dd MMMMM yyyy", CultureInfo.InstalledUICulture, DateTimeStyles.None, out dtObject)) { //valid date } 

对于多种格式,您可以在字符串数组中指定格式,稍后您可以使用它。 它返回一个bool值,指示解析是否成功。

来自MSDN的示例:

 string[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", "M/d/yyyy h:mm", "M/d/yyyy h:mm", "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm"}; string[] dateStrings = {"5/1/2009 6:32 PM", "05/01/2009 6:32:05 PM", "5/1/2009 6:32:00", "05/01/2009 06:32", "05/01/2009 06:32:00 PM", "05/01/2009 06:32:00"}; DateTime dateValue; foreach (string dateString in dateStrings) { if (DateTime.TryParseExact(dateString, formats, new CultureInfo("en-US"), DateTimeStyles.None, out dateValue)) Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue); else Console.WriteLine("Unable to convert '{0}' to a date.", dateString); 

这是一个非常古老的问题,但对于仍然在研究复杂的自然语言日期解析的人,我建议使用nChronic,这是一个令人惊叹的(基于ruby的)慢性日期解析器的.NET端口。

它的来源是: nChronic Github

它也是Nuget中的慢性病:Nuget中的慢性病

使用此库的一些非常简单的示例代码将是这样的:

 using Chronic; var parser = new Chronic.Parser (); Span ParseObj; DateTime ParsedDateTime; ParseObj = parser.Parse ("January 11th"); ParsedDateTime = ParseObj.Start; 

以下是它可以处理的一些示例:

简单

  • 星期四
  • 十一月
  • 夏季
  • 星期五
  • 13:00
  • 星期一2:35
  • 下午4点
  • 10到8
  • 10点过去2点
  • 2点半
  • 早上6点
  • 星期五下午1点
  • 晚上7点
  • 昨天
  • 今天
  • 明天
  • 上个星期
  • 下周
  • 本周二
  • 下个月
  • 去年冬天
  • 今天早上
  • 昨晚
  • 这第二个
  • 昨天凌晨4点
  • 上周五20:00
  • 上周二
  • 明天下午6:45
  • 下午
  • 昨天
  • 星期四上周

复杂

  • 3年前
  • 一年前
  • 5个月前
  • 7小时前
  • 7天后
  • 因此1周
  • 在3个小时内
  • 1年前的明天
  • 3个月前周六下午5点
  • 中午7点前中午
  • 11月3日星期三
  • 明年第3个月
  • 9月3日星期四
  • 上周第四天
  • 2010年6月14日晚上11点
  • 可能是97年7月7日凌晨三点

具体日期

  • 1月5日
  • 六月二十二日
  • 2017年5月5日
  • 二月二十一日
  • 12月25日
  • 5月27日
  • 2006年10月
  • 10月06日
  • 2010年1月3日
  • 2004年2月14日
  • 2004年2月14日
  • 2000年1月3日
  • 4月17日
  • 1979年5月27日
  • 27/5/1979
  • 05/06
  • 1979年5月27日
  • 星期五
  • 4:00
  • 17:00
  • 0800

具体时间(以上许多时间增加)

  • 1月5日晚上7点
  • 6月22日上午8点
  • 1979-05-27 05:00:00
  • 03/01/2012 07:25:09.234567

等等

我有类似的问题,这里有更好的方法

  stringdate="August 19th 2000" string pattern = @"\b(\d+)(?:st|nd|rd|th)\b"; Regex rgx = new Regex(pattern); DateTime.Parse(String.Format("{0:MMMM, d, yyyy}", rgx.Replace(stringdate, "$1")) **result** {19/08/2000 00:00:00} System.DateTime 

从Microsoft和regex删除序数和如何可视化各种DateTime格式的显示方式?