DateTime.TryParseExact不断返回false



我有以下代码,它接受lines数组中的元素并检查它是否与日期时间格式匹配。这个检查只运行在元素37、38、40、41上。给出下面的代码和调试输出,我可以看到输出与解析匹配。那么为什么返回false呢?

可能的输入:

05/03/2005 23:59:59.999
05/3/2005 23:59:59.999
5/03/2005 23:59:59.999
5/3/2005 23:59:59.999
etc...

代码:

lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
DateTime datetest;
if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
{
}
else
{
    //Log and Drop
    logfile.WriteLine(System.DateTime.Now.ToString("yyyy.MM.dd.HH.mm.ss") + ": Row #" + row + ", Column #" + (i) + " was not a date in the right format, dropping line. ");
    logfile.WriteLine("Original: " + lines[i]);
    Console.WriteLine("Date Wrong");
    Console.WriteLine("Date: " + lines[i]);
    string input = Console.ReadLine();
    continue;
}
控制台输出

:

Date Wrong
Date: 5/23/2004 23:59:59.999

更新:

我尝试更改解析以查找M/dd/yyyy。然而,我现在得到的却是这样的输出:

Date Wrong
Date: 05/23/2005 23:59:59.999
更新2:

好的,我试着改变解析来寻找"M/d/yyyy HH:mm:ss"。就像许多人建议的那样。我现在得到的输出是:

Date Wrong
Date: 23.59.59.999
更新3:

好的,我现在已经尝试了"M/d/y H: M:s"。如建议的那样,我仍然得到如下输出:

Date Wrong
Date: 05/23/2005 23:59:59.999

注:答案基于问题开始变形前的原始修订。

为什么返回false呢?

MM格式需要两位数字表示月份。您的日期字符串只有一个数字。使用M月格式。毫秒格式字符串应该是fff而不是mmm

下面的格式字符串将解析您的输入
M/dd/yyyy HH:mm:ss.fff

来演示:

DateTime datetest;
Console.WriteLine(DateTime.TryParseExact("5/23/2004 23:59:59.999", 
    "M/dd/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None, 
    out datetest));

输出<>之前真正的之前

如果您希望允许个位数月份,那么您需要d而不是dd。为了进行更深入的操作,您需要确定希望支持哪种格式的日期。

您尝试解析的日期时间格式错误。修改为:"M/dd/yyyy HH:mm:ss。fff "

对评论的回应:

DateTime datetest;
var dateTimes = new [] { "05/03/2005 23:59:59.999", "05/3/2005 23:59:59.999", "5/03/2005 23:59:59.999", "5/3/2005 23:59:59.999" };
foreach(var dateTimeToParse in dateTimes)
    if (DateTime.TryParse("5/3/2005 23:59:59.999", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
        Console.WriteLine(dateTimeToParse + " parses to: " + datetest);
    else
        Console.WriteLine("FAIL!");

在我的机器上运行:

05/03/2005 23:59:59 999解析到:2005-05-03 23:59:59

2012-05-03 23:59:59

5/03/2005 23:59:59.999解析到:2005-05-03 23:59:59

我看不到行[I]的内容,但是评论中描述的格式和TryParse中使用的格式之间的不匹配可能只是你的问题:

lines[i] = lines[i] + " 23:59:59.999"; //YYYY-MM-DDThh:mm:ss[.mmm]
...
if (DateTime.TryParseExact(lines[i], "MM/dd/yyyy HH:mm:ss.mmm",

使用这个(就像已经建议的Hans和David):

class Program
{
    static void Main(string[] args)
    {
        List<String> datetimeList = new List<string>();
        datetimeList.Add("05/03/2005 23:59:59.999");
        datetimeList.Add("05/3/2005 23:59:59.999");
        datetimeList.Add("5/03/2005 23:59:59.999");
        datetimeList.Add("5/3/2005 23:59:59.999");
        DateTime datetest;
        foreach (string s in datetimeList)
        {
            if (!DateTime.TryParseExact(s, "M/d/yyyy HH:mm:ss.fff", new CultureInfo("en-US"), DateTimeStyles.None, out datetest))
            {
                Console.WriteLine("Error");
            }
            else
            {
                Console.WriteLine("Success");
            }
        }
        Console.Read();
    }
}

打印4次Success

这只是一个概念证明,我不想要任何支持

最新更新