Разбор даты, например, "среда, 13 января 2010 года", в .NET - PullRequest
22 голосов
/ 13 января 2010

Как я могу преобразовать следующие строки в объект 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' в строке

Обновление

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

Ответы [ 7 ]

15 голосов
/ 13 января 2010

Как насчет их раздеть?

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);
4 голосов
/ 13 января 2010

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

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 голосов
/ 26 января 2016

Другая альтернатива, использующая управляющие символы для обработки (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);
2 голосов
/ 13 января 2010

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

  • мо й у
  • 1008 * вторник *
  • 1010 * среда *
  • й ursday
  • Пятница
  • Сату й у
  • су й у

  • * январь 1029 *

  • Февраль
  • марта
  • Апрель
  • может
  • июнь
  • Июль
  • 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);
0 голосов
/ 14 августа 2016

Расширяя подход Кенни, я добавил код для передачи целых чисел в переменную 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);
0 голосов
/ 13 января 2010

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

0 голосов
/ 13 января 2010

Мне не за что, но это выглядит интересно для общего анализа DataTime: http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx?msg=3299749

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...