簡體   English   中英

DateTime.TryParseExact不斷返回false

[英]DateTime.TryParseExact constantly returns false

我有以下代碼,它在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

注意:根據開始變體之前問題的原始版本進行回答。

為什么它返回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 為了使您能夠繼續進行下去,您需要准確地確定希望支持的日期格式。

您嘗試解析為錯誤的日期時間格式。 更改為:“ 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!");

適用於我的機器:

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

2005年5月3日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

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

使用這個(就像已經建議的漢斯和戴維一樣):

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次“成功”。

這只是一個概念證明,我不希望有任何投票。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM