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

Ben*_*aum 8 c# datetime

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

我正在处理各种格式的日期,其中一些是格式January 11thFebruary 22nd等等.

DateTime.Parse 尝试解析这些日期时抛出异常.

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

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

Hab*_*bib 14

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

对于后缀日期st,th你可以使用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
}
Run Code Online (Sandbox Code Playgroud)

对于多种格式,您可以在字符串数组中指定格式,稍后您可以使用它.它返回一个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);
Run Code Online (Sandbox Code Playgroud)


小智 14

这是一个非常古老的问题,但对于仍然在研究复杂的自然语言日期解析的人,我建议使用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;
Run Code Online (Sandbox Code Playgroud)

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

简单

  • 星期四
  • 十一月
  • 夏季
  • 星期五
  • 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日凌晨3点

具体日期

  • 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

等等


ma1*_*169 5

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

  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
Run Code Online (Sandbox Code Playgroud)

Microsoftregex 删除序数以及如何可视化各种 DateTime 格式的显示方式?

编辑

如果未指定年份:

    stringdate= rgx.Replace(stringdate, "$1");
    DateTime datetime;
    if (!DateTime.TryParseExact(stringdate, "MMMM dd yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None, out datetime))
    {
     // assuming no gap exist
     datetime = DateTime.Parse(stringdate += " "+DateTime.Now.Year);
    }
Run Code Online (Sandbox Code Playgroud)

现在,如果输入字符串 text 是"June 11th",它将是 11/6/2021

DateTime 文档中有更多的函数和方法来处理日期。

如果您根本不想要年份,则可以添加以下行:

datetime.ToString("MM/dd");
Run Code Online (Sandbox Code Playgroud)

现在输出将是“11/6”