A DateTime
значение не имеет формата - это просто значение. (Точно так же, как int
не является по своей сути десятичным или шестнадцатеричным - вы выбираете, как отформатировать его при преобразовании в строку, и по умолчанию используется десятичное число.)
Строка, в которую вы передаете DateTime.ParseExact
, является ожидаемым форматом ввода - и ваши строки не имеют формата "гггг мм дд". (Обратите внимание, что в строках формата даты / времени «мм» означает минуты, так что вы все равно захотите «ММ» вместо «мм» ... но здесь это не поможет.)
Ваш формат даты почти"d MMM гггг" (день, короткое название месяца, год) с использованием английских названий месяцев, но проблема заключается в порядковой части ("st", "nd", " го "). Насколько я знаю, нет простого способа справиться с этим с помощью DateTime.ParseExact
. Вместо этого я, вероятно, использовал бы регулярное выражение или простую замену строки, чтобы удалить порядковую часть, чтобы у вас do была строка в формате "d MMM yyyy", а затем она была проанализирована.
Для части, заменяющей строку, уместны ответы на этот вопрос . Итак, вот полный пример, использующий ваши примеры данных:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Console.WriteLine(ParseWithOrdinals("10th Mar 2015"));
Console.WriteLine(ParseWithOrdinals("1st Oct 2018"));
}
private static DateTime ParseWithOrdinals(string input) =>
DateTime.ParseExact(
RemoveOrdinals(input), // Text to parse
"d MMM yyyy", // Format of text
CultureInfo.InvariantCulture); // Expect English month names, Gregorian calendar
// From https://stackoverflow.com/questions/17710561
private static string RemoveOrdinals(string input) =>
input
.Replace("0th", "0")
.Replace("1st", "1")
.Replace("2nd", "2")
.Replace("3rd", "3")
.Replace("11th", "11") // Need to handle these separately...
.Replace("12th", "12")
.Replace("13th", "13")
.Replace("4th", "4")
.Replace("5th", "5")
.Replace("6th", "6")
.Replace("7th", "7")
.Replace("8th", "8")
.Replace("9th", "9");
}
(Обратите внимание, что я не форматировал результат как yyyy-MM-dd в выводе, поэтому вы получите локальный формат даты / времени.)