Подтвердить что ты не робот

Разбор даты вроде "Среда 13 января 2010" с .NET

Как преобразовать следующие строки в объект System.DateTime?

Среда 13 января 2010 г.
Четверг 21 января 2010 года
Среда, 3 февраля 2010 г.

Обычно что-то вроде следующего:

DateTime dt;
DateTime.TryParseExact(value, "dddd d MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt);

но это не работает из-за 'th', 'st' или 'rd' в строке

Update

Похоже, что DateTime не поддерживает форматирование 'th', 'st', 'rd' и т.д., поэтому их нужно удалить перед разбором. Rubens Farias предлагает приятное регулярное выражение ниже.

4b9b3361

Ответ 1

Как насчет их полос?

string value = "Wednesday 13th January 2010";
DateTime dt;
DateTime.TryParseExact(
    Regex.Replace(value, @"(\w+ \d+)\w+ (\w+ \d+)", "$1 $2"),
    "dddd d MMMM yyyy", 
    DateTimeFormatInfo.InvariantInfo, 
    DateTimeStyles.None, out dt);

Ответ 2

Другой подход.

string sDate = "Wednesday 13th January 2010";
string[] sFields = sDate.Split (' ');
string day = sFields[1].Substring (0, (sFields[1].Length - 2));
DateTime date = new DateTime (sFields[3], sFields[2], day);

Ответ 3

Другая альтернатива, использующая escape-символы для обработки (st, nd, rd и th), не удаляя их перед вызовом DateTime.TryParseExact

string dtstr = "Saturday 23rd January 2016";
DateTime dt;
string[] formats = new string[] { 
    "dddd d\\s\\t MMMM yyyy", "dddd d\\n\\d MMMM yyyy",
    "dddd d\\r\\d MMMM yyyy", "dddd d\\t\\h MMMM yyyy" };
bool result = DateTime.TryParseExact(dtstr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

Ответ 4

Где появляются "th", "st", "nd" или "rd"?

  • мо й ау
  • вторнику
  • Среда
  • й ursday
  • пятница
  • Сату е ау
  • су й ау

  • январь

  • февраля
  • март
  • апреля
  • может
  • июня
  • июль
  • Augu й
  • сентябрь
  • октябрь
  • ноября
  • декабря

Однако вы знаете, что за этими 4 всегда будет пробел. Поэтому, если я что-то пропустил, просто

value = value.Replace("August","Augus").Replace("nd ","").Replace("st ","").Replace("nd ","").Replace("rd ","").Replace("Augus","August");
DateTime dt;
DateTime.TryParseExact(value,"DDDD dd MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt);

Ответ 6

Я вспомнил этот пост при использовании MGrammar, чтобы разобрать много разных способов выражения дат и времени. Это точно не отвечает на ваш вопрос, но может служить полезной базой в зависимости от вашей конечной цели.

Ответ 7

Расширяя подход Kenny, я добавил код для передачи целых чисел в переменную DateTime...

string sDate = "Wednesday 13th January 2010";
string[] dateSplit = sDate.Split (' ');
string day = dateSplit[1].Substring(0, dateSplit[1].Length - 2);
int monthInDigit = DateTime.ParseExact(dateSplit[3], "MMMM", CultureInfo.InvariantCulture).Month;
DateTime date = new DateTime(Convert.ToInt16(year), monthInDigit, day);