【问题标题】:DateTime.TryParse all possible type of datesDateTime.TryParse 所有可能的日期类型
【发布时间】:2010-02-24 13:02:41
【问题描述】:

我想检查日期的格式是否正确。有很多正确日期的可能性,例如:

  • 02.08.2010
  • 2.8.2010
  • 02.8.2010 02.08
  • 02.August
  • ...

我可以用这样的代码测试每个:

if (DateTime.TryParse(DateTime.ParseExact(date, "dd.M.", 
                              new CultureInfo("sl-SI")).ToString(), out dt))

但是我可以有 40 个 if 语句。是否可以用一个 if 语句或一个循环检查所有日期?

更新:

根据目前的答案,我正在测试这段代码,但我还有一个问题。如果我只有 9.2 而不是 9.2.2010 那么此代码将不起作用:

CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();

if (DateTime.TryParseExact(date, fmts, ci, DateTimeStyles.AssumeLocal, out dt))
{
    DateTime = Convert.ToDateTime(date);
    Check = true;
}

我必须手动添加这个时间还是我能做什么?

【问题讨论】:

标签: c# datetime


【解决方案1】:

您可以使用类似以下的内容,但请注意,可能不止一种格式可以解析相同的日期。例如 10/11/12 可以解析为 yy/MM/dd 或 MM/dd/yy,它们都是有效的美国日期格式。 MM/dd/yy 更常见,因此它出现在列表的第一位,并且是下面代码返回的那个(如果您将它与美国文化而不是示例中的文化一起使用)。

string testValue = "10.11.12";

DateTime result;
CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
Console.WriteLine(String.Join("\r\n", fmts));
if (DateTime.TryParseExact(testValue, fmts, ci,
   DateTimeStyles.AssumeLocal, out result))
{
   Console.WriteLine(result.ToLongDateString());
}

【讨论】:

  • 在我居住的世界上,人类会将其解析为“dd.mm.yy”。考虑到这一点,整个问题就没有什么意义了,因为它很容易被误解。
【解决方案2】:

是的,ParseExact 可以获取要检查的格式列表。

var formats = new[] { "M.d.yyyy", "dd.MM.yyyy" };
var dateValue = DateTime.ParseExact(
    dateString, formats, new CultureInfo("sl-SI"), DateTimeStyles.None);

【讨论】:

    【解决方案3】:

    您实际上可以尝试每种可能的模式中的所有日期格式,然后使用 ParseExact 格式化您想要的值

    public string GetDateFormat(string input)
        {
            string[] formats = {"M/d/yyyy", "MM/dd/yyyy",
                            "d/M/yyyy", "dd/MM/yyyy",
                            "yyyy/M/d", "yyyy/MM/dd",
                            "M-d-yyyy", "MM-dd-yyyy",
                            "d-M-yyyy", "dd-MM-yyyy",
                            "yyyy-M-d", "yyyy-MM-dd",
                            "M.d.yyyy", "MM.dd.yyyy",
                            "d.M.yyyy", "dd.MM.yyyy",
                            "yyyy.M.d", "yyyy.MM.dd",
                            "M,d,yyyy", "MM,dd,yyyy",
                            "d,M,yyyy", "dd,MM,yyyy",
                            "yyyy,M,d", "yyyy,MM,dd",
                            "M d yyyy", "MM dd yyyy",
                            "d M yyyy", "dd MM yyyy",
                            "yyyy M d", "yyyy MM dd",
                            "d-MMM-yyyy", "d/MMM/yyyy", "d MMM yyyy", "d.MMM.yyyy",
                            "d-MMM-y", "d/MMM/y", "d MMM y", "d.MMM.y",
                            "dd-MMM-yyyy", "dd/MMM/yyyy", "dd MMM yyyy", "dd.MMM.yyyy",
                            "MMM/dd/yyyy", "MMM-dd-yyyy", "MMM dd yyyy", "MMM.dd.yyyy", "MMM.dd.yyyy"
                           };
    
            DateTime dateValue;
            foreach (string dateStringFormat in formats)
            {
                if (DateTime.TryParseExact(input, dateStringFormat,
                                           CultureInfo.InvariantCulture,
                                           DateTimeStyles.None,
                                           out dateValue))
                {
                    Console.WriteLine(dateStringFormat);
    
                    return dateStringFormat;
                }
            }
    
            return null;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2020-06-20
      相关资源
      最近更新 更多