c# - today - Analizando una fecha como "Miércoles 13 de enero de 2010" con.NET
formato fecha datetime c# (7)
¿Cómo puedo convertir las siguientes cadenas a un objeto System.DateTime?
Miércoles 13 de enero de 2010
Jueves 21 de enero de 2010
Miércoles 3 de febrero de 2010
Normalmente algo como lo siguiente lo haría
DateTime dt;
DateTime.TryParseExact(value, "dddd d MMMM yyyy", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out dt);
pero esto no funciona debido a la ''th'', ''st'' o ''rd'' en la cadena
Actualizar
Parece que DateTime no admite el formateo de ''th'', ''st'', ''rd'', etc., por lo que deben eliminarse antes de realizar el análisis. Rubens Farias proporciona una agradable expresión regular a continuación.
¿Dónde aparece "th", "st", "nd" o "rd" a continuación?
- mo nd ay
- martes
- miércoles
- el jueves
- viernes
- satu rd ay
su nd ay
enero
- febrero
- marzo
- abril
- mayo
- junio
- julio
- augu st
- septiembre
- octubre
- noviembre
- diciembre
Sin embargo, usted sabe que esos 4 siempre serán seguidos por un espacio. Entonces, a menos que me haya perdido algo, un simple
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);
¿Qué hay de despojarlos?
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);
Ampliando el enfoque de Kenny, agregué un código para pasar enteros a la variable 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);
Otra alternativa es usar caracteres de escape para manejar ( st
, nd
, rd
y th
) sin quitarlos antes de la llamada de 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);
Otro enfoque.
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);
Recordé esta publicación sobre el uso de MGrammar para analizar muchas formas diferentes de expresar fechas y horas. No responde exactamente su pregunta, pero podría servir como una base útil según cuál sea su objetivo final.
Sin crédito para mí, pero esto parece interesante para el análisis general de DataTime: http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx?msg=3299749