DateTime.TryParseExact不断返回false

时间:2014-07-02 15:03:41

标签: c# parsing datetime

我有以下代码,它接受lines数组中的元素并检查它是否与datetime格式匹配。此检查仅在元素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.fff"许多人建议。我现在得到的输出是:

Date Wrong
Date: 23.59.59.999

更新3:

好的我现在已经尝试过" M / d / y H:m:s.fff"按照建议,我仍然得到输出:

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

4 个答案:

答案 0 :(得分:3)

注意:在问题开始变形之前根据问题的原始修订进行回答。

  

为什么它会返回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));

输出

True

如果您希望允许单个数字月,则需要d而不是dd。为了让您更进一步,您需要确切了解您希望支持的日期格式。

答案 1 :(得分:2)

您尝试解析的日期时间格式错误。将其更改为:" 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

05/3/2005 23:59:59.999解析:2005-05-03 23:59:59

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

2005年5月3日23:59:59.999解析:2005-05-03 23:59:59

答案 2 :(得分:1)

我看不到行[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",

答案 3 :(得分:1)

使用这个(就像已经建议的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次&#34;成功&#34;

这只是一个概念证明,我不想要任何赞成。