2009-08-14 23 views
8

He creado un analizador genérico para analizar archivos ASCII. Cuando quiero analizar las fechas, uso la función ParseExact en el objeto DateTime para analizar, pero tengo problemas con el año.Análisis de cadenas DateTime

El texto a analizar es, por ejemplo, "090812" con la cadena parseExact "yyMMdd".

Espero obtener un objeto DateTime que diga "12/8-2009", pero obtengo "12/8-1909". Sé que podría hacer una solución fea al analizarla posteriormente, y modificar así el año ...

¿Alguien sabe de una manera inteligente de resolver esto?

Gracias de antemano ..

Søren

+0

Los documentos y otras publicaciones sugieren que esto debería funcionar para la fecha que proporcionó (por ejemplo, 2009 para 09). ¿Puedes publicar la llamada exacta de ParseExact que estás haciendo? – Joe

+1

Más información aquí: http://msdn.microsoft.com/en-us/library/system.globalization.gregoriancalendar.tofourdigityear.aspx – Joe

Respuesta

17

manera Teóricamente elegante de hacer esto: cambiar la propiedad de la TwoDigitYearMaxCalendar utilizado por el DateTimeFormatInfo que está utilizando para analizar el texto. Por ejemplo:

CultureInfo current = CultureInfo.CurrentCulture; 
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone(); 
// I'm not *sure* whether this is necessary 
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone(); 
dtfi.Calendar.TwoDigitYearMax = 1910; 

A continuación, utilice dtfi en su llamada a DateTime.ParseExact.

Forma práctica de hacer esto: agregue "20" al inicio de su entrada, y analice con "aaaamMMdd".

+0

Me gusta un poco su solución teórica. El 'DateTimeFormatInfo' es solo una configuración única de todos modos. También permite diferentes puntos de corte en lugar de asumir que todo está en este siglo. – Thorarin

+0

Se ve bien .. No estoy seguro, ¿qué estás tratando de hacer ...? Pero de todos modos, dtfi.Calendar.TwoDigitYearMax solo se puede establecer en un número superior a 99 .. :-(.. Y no estoy feliz con la solución con solo agregar "20" al frente, ya que no puedo garantizar esto no se usa para ver datos anteriores

+0

@MullerDK: Lo sentimos, debe establecerse en 2000 ... o quizás 1910 si desea que 100812 sea 1910, etc. –

2

Usted tendrá que determinar una especie de fecha límite adecuado para sus datos. Si la fecha analizada es anterior a esta fecha, agregue 100 años. Una forma segura de hacer eso es prefijar la cadena de entrada con el siglo apropiado. En este ejemplo he elegido 1970 como el punto de corte:

string input = ...; 
DateTime myDate; 

if (Convert.ToInt32(input.Substring(0, 2)) < 70) 
    myDate = DateTime.ParseExact("20" + input, ...); 
else 
    myDate = DateTime.ParseExact("19" + input, ...); 

Jon Skeet también registró un buen ejemplo usando DateTimeFormatInfo que había olvidado momentáneamente sobre :)

2

Bueno, si eres definitiva de que todos sus las fechas de origen son de este siglo, entonces podría usar parseExact contra una cadena fuente prefijada de "20".

Cuestiones relacionadas