【问题标题】:Parsing this kind of string into DateTime - "Friday 22nd March 2013" (C#)将这种字符串解析为 DateTime - "Friday 22nd March 2013" (C#)
【发布时间】:2013-03-10 08:55:09
【问题描述】:

我有一大段这样的文字:

....建议 2013 年 3 月 22 日星期五有可能被宣布为一天.....

我必须在其中找到并解析 DateTime(2013 年 3 月 22 日星期五)。我可以找到它并使用 DateTime.TryParse 来获取几乎所有内容,但是序数后缀 (st,nd,rd,th) 让我失望。

当我在调用 TryParse 方法之前构造格式字符串时,是否可以使用任何通配符来考虑这些后缀?或者有什么其他建议?

谢谢!

【问题讨论】:

  • 您是否尝试过使用 string.replace 或正则表达式删除它们的后缀?这是一个选择吗?

标签: c# datetime-parsing


【解决方案1】:

an overload of DateTime.Parse that allows multiple format strings - 您可以将序数作为文字字符串传递,就像这个辅助方法(使用线程语言环境来计算月/日名称拼写):

private static DateTime ParseOrdinalDateTime(string dt)
{
    string[] expectedFormats = new[] {
                                        "dddd d'st' MMMM yyyy",
                                        "dddd d'nd' MMMM yyyy",
                                        "dddd d'rd' MMMM yyyy",
                                        "dddd d'th' MMMM yyyy"
                                      };

    return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None);
}

【讨论】:

    【解决方案2】:

    你总是可以蛮力它。

    注意:我将借用 Fuji 的一些代码,以便我们拥有相同的外观和感觉。

    string date = "Friday 22nd March 2013";
    string[] split = date.Split(' ');
    string dayOfWeek = split[0]; // throw away & don't need
    int day = Convert.ToInt32(split[1].SubString(0, split[1].Length - 2);
    int month = 0;
    switch (split[2]) {
      case "January": month = 1; break;
      case "February": month = 2; break;
      case "March": month = 3; break;
      case "April": month = 4; break;
      case "May": month = 5; break;
      case "June": month = 6; break;
      case "July": month = 7; break;
      case "August": month = 8; break;
      case "September": month = 9; break;
      case "October": month = 10; break;
      case "November": month = 11; break;
      case "December": month = 12; break;
    }
    int year = Convert.ToInt32(split[3]);
    var dateTime = new DateTime(year, month, day);
    Console.WriteLine(dateTime);
    

    不是 100% 我得到了正确的“新日期时间”构造函数。我现在没有运行我的 IDE。

    【讨论】:

      【解决方案3】:

      使用regex 替换不需要的字符怎么样?

      例如,以下正则表达式应该可以完成这项工作:"(?<=\d)[a-z]{2}"

      示例代码

      string date = "Friday 22nd March 2013";
      var r = new Regex(@"(?<=\d)[a-z]{2}");
      String result = r.Replace(date, "");
      Console.WriteLine(DateTime.Parse(result, CultureInfo.InvariantCulture));
      

      输出:

      22/03/2013 00:00:00
      

      这应该可以解决大多数情况,但请确保正确测试它。

      【讨论】:

      • 当你有星期天时,“nd”将被替换为“”,然后是kaboom!
      • @NikolaDavidovic 你读过我的完整答案了吗?再读一遍最后一部分。 :)
      • 你建议的答案是错误的,但后来概括是好的。为什么不建议使用正则表达式?
      • 当然。我可以这样做,但我面前没有 IDE,所以我不想发布可能有错误的代码。相反,我给了他一个简单的例子并解释了这个概念。
      • 谢谢大家,我会试试的
      猜你喜欢
      • 2011-11-26
      • 2011-07-18
      • 2013-04-04
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2013-11-21
      相关资源
      最近更新 更多