Используйте DateTime.TryParseExact для форматирования строки даты и игнорирования времени - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу разобрать строковую дату до DateTime, но игнорирую время.Мой ожидаемый формат даты - M/d/yyyy, 3/29/2018 (без нуля в начале).Дело в том, что строка может быть с или без части времени, а время может иметь разные форматы, которые я не буду предсказывать.

var inputDateString = "12/31/2017 12:00:00 AM" // false, but I want to parse
var inputDateString = "12/31/2017" // true
DateTime.TryParseExact(inputDateString, "M/d/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate); 

Есть ли способ проанализировать строку даты, имеющую только определенный формат даты, и игнорировать время?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы можете удалить часть времени из входной строки или проанализировать полный ввод, используя только часть .Date.

var parsedDate = DateTime.MinValue;
var inputDateString = "12/31/2017 12:00:00 AM"; // false, but I want to parse

// option 1: use only the date part
if (DateTime.TryParseExact((inputDateString ?? "").Split(' ')[0] , "M/d/yyyy", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
    Console.WriteLine(parsedDate);

// option 2: use the full input, but ignore the time
if (DateTime.TryParseExact(inputDateString, "M/d/yyyy hh:mm:ss tt", 
        CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
    Console.WriteLine(parsedDate.Date);

Лично я бы выбрал первый вариант.

0 голосов
/ 19 сентября 2018

Существует перегрузка на TryParseExact, которая позволяет передавать в нескольких форматах.Если вы заранее знаете, какие форматы ожидать, вы можете использовать эту перегрузку:

void Main()
{
    string[] validFormats = {"M/d/yyyy", "M/d/yyyy hh:mm:ss tt"};

    var inputDateString1 = "12/31/2017 12:00:00 AM"; // false, but I want to parse
    var inputDateString2 = "12/31/2017"; // true

    DateTime.TryParseExact(inputDateString1, validFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt1);
    DateTime.TryParseExact(inputDateString2, validFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt2);

}

Затем вы можете получить только часть даты, используя свойство Date.

0 голосов
/ 18 сентября 2018

Если вы всегда хотите анализировать только часть даты, которую можно выполнить, явно указав, что длина строки составляет всего 10 символов.Это несколько запутанный пример, но вы можете вырезать то, что вам не нужно, вы получите идею:

var inputDateString = "12/31/2017 12:00:00 AM";
string datePortion = string.Empty;
DateTime dt;

if (inputDateString.Length>10)
{
    // take first 10 characters of inputDateString
    datePortion = inputDateString.Substring(0, Math.Min(inputDateString.Length, 10));
}
else if (inputDateString.Length==10)
{
    // inputDateString is already 10 characters
    datePortion = inputDateString;
}
else
{
    // inputDateString is less than 10 characters, no date found, do nothing.
}

if(!DateTime.TryParse(datePortion, out dt))
{
   // handle error that occurred, 
}
else
{
    // parse was successful, carry on.
}
...