2013-06-20 117 views
1

我有以下方法,它能正常工作,只要處理一個真正的無效/有效日期,但是,如果我遇到一個空的字符串或日期與掩碼如__/__/____,我想通過那些有效,但DateTime.TryParse使它們失效。我如何修改下面的方法來傳遞我的無效方案?下面下面的方法是一個示例程序:處理無效日期爲有效?

public bool ValidateDate(string date, out string message) 
{ 
    bool success = true; 
    message = string.Empty; 
    DateTime dateTime; 

    if(DateTime.TryParse(date,out dateTime)) 
    { 
     success = false; 
     message = "Date is Invalid"; 
    } 

    return success; 
} 

void Main() 
{ 
    //The only date below that should return false is date4. 

    string date = "01/01/2020"; 
    string date2 = ""; 
    string date3 = "__/__/____"; 
    string date4 = "44/__/2013"; 

    string message; 

    ValidateDate(date, out message); //Should return true 
    ValidateDate(date2, out message); //Should return true 
    ValidateDate(date3, out message); //Should return true 
    ValidateDate(date4, out message); //Should return false 
} 

我不能將其更改爲if(!DateTime.TryParse(date3,out dateTime)),因爲這會然後我想驗證的日期返回false。

我也試過做類似if(!date3.contains("_") && DateTime.TryParse(date3,out dateTime)),但這仍然失敗。我應該翻轉我的驗證順序嗎?問題是,我不只是返回false第一個無效的日期,我建立所有的無效日期的StringBuilder,然後再返回這一點,所以我沒想到:

if(DateTime.TryParse(date3,out dateTime)) 
     return true; 
    else 
     return true; 

public bool ValidateDate(string date, out string message) 
{ 
    string[] overrides = {"","__/__/____"}; 

    bool success = true; 
    message = string.Empty; 
    DateTime dateTime; 

    if(!overrides.Contains(date) && !DateTime.TryParse(date,out dateTime)) 
    { 
     success = false; 
     message = "Date is Invalid"; 
    } 


    return success; 
} 
+0

你幾乎肯定會寫一個正則表達式來處理這個問題。 – Yuck

+0

看看這裏:http://stackoverflow.com/questions/4962276/best-way-to-get-a-date-with-net – frenchie

+0

@Yuck - 我想到了正則表達式。你能夠提供答案嗎? – Xaisoft

回答

4

可你只是看看在運行DateTime.TryParse方法之前覆蓋的數組?

static string[] overrides = { "", "__/__/____" }; 
public bool ValidateDate(string date, out string message) 
{ 
    bool success = true; 
    message = string.Empty; 

    if(overrides.Contains(date)) { return success; } 

    DateTime dateTime; 

    if(!DateTime.TryParse(date,out dateTime)) 
    { 
     success = false; 
     message = "Date is Invalid"; 
    } 


    return success; 
} 
+0

我想你可能是對的。我已經嘗試了一切,所以我會給這個鏡頭。 – Xaisoft

+0

如果 –

+0

@MattJohnson錯過了第二個'!' - 效果很好,我只做了一個小小的修改,因爲我處理了其他驗證,我不能只返回成功的日期,因此請查看更新的方法並讓我知道它看起來不錯嗎? – Xaisoft

1

有很多方法去皮膚這隻貓。我想這取決於你想要視爲有效的多少無效數據。此外,DateTime.TryParse將考慮到當前的文化背景,所以也許你也應該這樣做?

bool ValidateDate(string date, out string message) 
{ 
    message = string.Empty; 

    if (date == null) 
     return true; 

    const string mask = "_"; 
    var separator = CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator; 
    var test = date.Replace(mask, string.Empty).Replace(separator, string.Empty); 
    if (string.IsNullOrWhiteSpace(test)) 
     return true; 

    DateTime dateTime; 
    if (!DateTime.TryParse(date, out dateTime)) 
    { 
     message = "Date is Invalid"; 
     return false; 
    } 

    return true; 
} 

我想你也可以用正則表達式來做到這一點。有很多有效的解決方案。

+0

你能詳細闡述一下文化嗎?無論文化如何,我的日期都將與「en-US」文化一起存儲? – Xaisoft

+2

作爲'DateTime'存儲,文化無關緊要。但是,作爲字符串,他們確實。你怎麼知道用戶會輸入mm/dd/yyyy或dd/mm/yyyy?你確定分隔符總是一個正斜槓,或者可能是一個短劃線或一段時間?如果一年到來會怎樣?如果你將要了解文化,那麼你必須考慮這些事情。如果您要鎖定某種特定的文化,那麼您應該使用'TryParseExact'並將格式和文化傳入。 –