Разбор даты вроде "Среда 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 предлагает приятное регулярное выражение ниже.
Ответы
Ответ 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);
Ответ 5
Никакой кредит для меня, но это выглядит интересным для общего анализа данных DataTime: http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx?msg=3299749
Ответ 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);