2013-06-20 2 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)), потому что это будет возвращать ложь для дат я хочу проверенными.

Я также пытался сделать что-то вроде if(!date3.contains("_") && DateTime.TryParse(date3,out dateTime)), но это все еще не удается. Должен ли я перевернуть порядок моей проверки? Проблема заключается в том, что я не просто возвращение ложным на первый неверную дату, я строю 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» и передать формат и культуру. –

Смежные вопросы