为什么C#中的DateTime.TryParseExact无法按预期工作

4
当我尝试运行时:
DateTime.TryParseExact(employeeHireDate, "mm/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate);

C# 把日期转换成了另一个日期,即 2015年1月5日,而我传递的是 2015年5月5日。

非常感谢您的帮助。

以下是我的代码:

static void Main(string[] args)
{
    string employeeHireDate = "05/05/2015";         
    DateTime dDate;
    var isDateValid= DateTime.TryParseExact(employeeHireDate, "m/d/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate);

    if (!isDateValid)
    {
        Console.WriteLine("Failed");
        Console.ReadLine();
    }
    else
    {
        Console.WriteLine("Success");
        Console.ReadLine();
    }
}

3
m代表分钟,M代表月份,因此MM表示两位数字的月份,dd表示日期。 - Alex K.
2
DateTime.TryParseExact 不起作用是错误的。它正在按照您告诉它要做的方式执行。 - user2023861
1
谢谢,我不知道 M 代表月份,mm 代表分钟。感谢您告诉我,我很感激。 - Marshall
3个回答

5

在格式字符串中,小写字母m代表分钟。如果你想表示月份,需要用大写字母M。如果没有指定月份的值,表示五分钟,则结果为一年的第一个月份。你应该使用以下格式:

DateTime.TryParseExact(employeeHireDate, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate);

以下是参考文献:

https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/custom-date-and-time-format-strings

这里提供了自定义日期和时间格式字符串的相关信息。

太棒了,这个修复帮了大忙。现在它可以正常工作了。谢谢你。 - Marshall
有没有一种方法可以让我的代码接受两种日期格式,即 MM/dd/yyyy 和 M/d/yyyy? - Marshall
是的。其中一个重载是针对格式数组的。 - Joel Coehoorn
1
太棒了,它起作用了,我做了这样的事情。 var formatStrings = new string[] { "M/d/yyyy", "MM/dd/yyyy" }; DateTime dDate; var isDateValid = DateTime.TryParseExact(employeeHireDate, formatStrings, CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate); - Marshall

5

使用

DateTime.TryParseExact(employeeHireDate, "MM/dd/yyyy", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate);

相反,应使用大写的"MM"mm表示分钟,MM表示月份(请参见文档)。


2

当您使用TryParseExact时,必须确保格式完全匹配。"05/05/2015"与"MM/dd/yyyy"匹配,而不是"m/d/yyyy"。

正确的写法应该是:

    var isDateValid= DateTime.TryParseExact(employeeHireDate, "MM/dd/yyyy",

 CultureInfo.InvariantCulture, DateTimeStyles.None, out dDate);

请注意,“mm”是代表分钟,而表示月份应该使用“MM”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接