【问题标题】:Parsing any date format string to datetime [closed]将任何日期格式字符串解析为日期时间 [关闭]
【发布时间】:2013-07-23 14:32:56
【问题描述】:

在 C# 中,如何将格式为 "dd/mm/yyyy" 或格式为 "dd-mm-yyyy" 的字符串解析为日期时间? 我收到一条错误消息,指出我的字符串格式不正确。我需要能够解析所有格式,而不仅仅是其中一种。

【问题讨论】:

  • “我需要能够解析所有格式” - 鉴于存在 dd/mm/yyyymm/dd/yyyy 格式,本月 12 日或更早的任何日期都必须是不明确的 - 它是计算机无法解决的问题。
  • 向我们展示您尝试过的代码。
  • 你想parse exactly什么格式?
  • @Corak 因为我来自意大利,所以我认为 dd/MM/yyyy 其实也不错。毫无疑问,MM/dd/yyyy 是最无意义和最令人困惑的一个。
  • @Teejay - 这里是德国,对我们来说是 dd.MM.yyyy。但是在添加时间时,这也很快成为“错误”。 “dd.MM.yyyy HH:mm:ss”?大夫?因此:"yyyy-MM-dd HH:mm:ss" => 逻辑! ^_^

标签: c# parsing datetime


【解决方案1】:

您可以定义任何您喜欢的格式 - 此外,您可以获得给定文化的默认值列表。

var ci = new CultureInfo("en-US");
var formats = new[] { "M-d-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "M.d.yyyy", "dd.MM.yyyy", "MM.dd.yyyy" }
        .Union(ci.DateTimeFormat.GetAllDateTimePatterns()).ToArray();

DateTime.ParseExact("07/23/2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("07-23-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("23-07-2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();
DateTime.ParseExact("23.07.2013", formats, ci, DateTimeStyles.AssumeLocal).Dump();

输出:

7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM
7/23/2013 12:00:00 AM

【讨论】:

    【解决方案2】:

    mm 表示分钟,大写MM 表示月份。

    除此之外,如果您想解析以/ 作为日期分隔符的字符串,则必须使用CultureInfo.InvariantCulture,因为这是当前区域性日期分隔符的替换字符:

    所以这行得通:

    DateTime.ParseExact("23/07/2013", "dd/MM/yyyy", CultureInfo.InvariantCulture);
    

    见:The "/" Custom Format Specifier

    【讨论】:

      【解决方案3】:

      您需要定义您希望接受的日期格式。没有所有格式这样的东西。一旦你定义了你可以将格式数组传递给DateTime.ParseExact

      您的代码可能如下所示:

      string[] formats = new string[2] {"dd/MM/yyyy", "dd-MM-yyyy"};
      
      string date = "23-02-2013";
      try
      {
          DateTime result = DateTime.ParseExact(date, formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
      }
      catch (FormatException)
      { 
          // your error handling code here
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用任何指定格式的DateTime.ParseExact 方法。

            var d = DateTime.ParseExact(token, "dd-MM-yyyy", 
                    CultureInfo.InvariantCulture, 
                    DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal);
        

        【讨论】:

        • 您的格式字符串错误。 mm 是分钟,而不是月份。
        • @JohnKoerner 感谢您了解这一点。
        猜你喜欢
        • 2014-05-25
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 2016-05-17
        • 1970-01-01
        相关资源
        最近更新 更多