Анализировать DateTime с ведущими нулями и без них

У меня есть TextBox, в котором пользователь может ввести дату. Я ожидаю только следующих форматов:

12.12.2017
12.02.2017
12.2.2017
02.12.2017
2.12.2017
02.02.2017
2.2.2017

Таким образом, может быть ведущий ноль или нет.

В настоящее время я разбираю DateTime со следующим кодом:

DateTime myDate = new DateTime();
bool success = DateTime.TryParseExact(TboDate.Text, "dd.MM.yyyy", 
                   CultureInfo.CurrentUICulture, DateTimeStyles.None, out myDate);

Такие даты, как 12.2.2017, не могут быть успешно проанализированы с помощью этого кода. Но я не хочу каждый раз проверять строку и затем анализировать ее с соответствующим форматом d.M.yyyy, dd.M.yyyy, d.MM.yyyy и так далее. Есть ли более простой способ сообщить методу, что могут быть ведущие нули?


person L3n95    schedule 10.04.2017    source источник
comment
Я подозреваю, что d.M.yyyy будет обрабатывать ведущие нули. Если нет, используйте перегрузку TryParseExact, которая поддерживает несколько форматов.   -  person Jon Skeet    schedule 10.04.2017
comment
Я проверил, все они без проблем разобрались с Parse/TryParse: DateTime.TryParse(dateStr, CultureInfo.CurrentUICulture, DateTimeStyles.None, out dt)   -  person Tim Schmelter    schedule 10.04.2017
comment
Оба ваших решения работают. Спасибо, я никогда не думал о TryParse.   -  person L3n95    schedule 10.04.2017


Ответы (1)


Все они могут быть без проблем проанализированы с помощью Parse/TryParse f.e. с культурой де-DE:

var dates = new[] { "12.12.2017", "12.02.2017", "12.2.2017", "02.12.2017", "2.12.2017", "02.02.2017", "2.2.2017" };      

foreach (var dateStr in dates)
{
    DateTime dt;
    if (!DateTime.TryParse(dateStr, CultureInfo.CurrentUICulture, DateTimeStyles.None, out dt))
    {
        Console.WriteLine("not valid: " + dateStr);
    }
}  

Но вы также можете использовать ParseExact, если укажете все разрешенные форматы:

string[] allowedFormats = { "dd.MM.yyyy", "d.MM.yyyy", "dd.M.yyyy", "d.M.yyyy" };
foreach (var dateStr in dates)
{
    DateTime dt;
    if (!DateTime.TryParseExact(dateStr, allowedFormats, CultureInfo.CurrentUICulture, DateTimeStyles.None, out dt))
    {
        Console.WriteLine("not valid: " + dateStr);
    }
}

Обновить

Как упомянул Джон Скит, нет необходимости указывать несколько, это обрабатывает все: "d.M.yyyy"

person Tim Schmelter    schedule 10.04.2017