2011-02-28 5 views
7

En mi aplicación Java utilizo una instancia DateFormat para analizar las entradas de fecha.¿Es posible crear un DateFormatter que convierta un año de dos dígitos en un año de cuatro dígitos?

DateFormat fmt; 
fmt = DateFormat.getDateInstance(DateFormat.DEFAULT) // dd.MM.yyyy for de_DE 

El problema es que el usuario insiste en que introducir fechas en forma 31.12.11.

Lamentablemente esto se analiza en 31.12.11. (0011-12-31 en formato ISO) En su lugar, quiero que la fecha analizada se convierta en 31.12.2011 (2011-12-31 en formato ISO).

¿Puedo modificar el formato de fecha para analizar las entradas de alguna manera?

Respuesta

11

Usted tendrá que analizar con un formato de dd.mm.aa y re-formato con un formato de aaaa-MM-dd

DateFormat sdfp = new SimpleDateFormat("dd.mm.yy"); 
Date d = sdfp.parse(input); 
DateFormat sdff = new SimpleDateFormat("yyyy-MM-dd"); 
String date = sdff.format(d); 

Ver la API de Java para obtener más información sobre la configuración de los patrones.

http://download.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

+1

Parece que mi pregunta era un poco ambigua. No quiero tener una representación de String en formato ISO, quiero que la fecha tenga el año correcto (2011 en lugar de 11, es decir, +2,000 años) –

+0

No estoy seguro de cómo Java tomará 11 como 2011 y no como 1911 o cualquier otro valor. – asgs

+0

@ josh.trow: hablé demasiado pronto, tu respuesta resuelve mi problema. –

5

Su solución es lo suficientemente simple como para permitir el uso de SimpleDateFormat, que incluye el método set2DigitYearStart(Date startDate). Quizás se ve algo como esto.

String userInput = "31.12.11"; 
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yy"); 
format.set2DigitYearStart(new GregorianCalendar(2001,1,1).getTime()); 
Date userEnteredDate = format.parse(userInput, 1); // parsed to 2011-12-31 
+0

Llamar 'set2DigitYearStart' solo anula la heurística 80-20.La solución real es usar el patrón 'yy' en lugar de' aaaa'. –

1

Sí, podría analizar utilizando DateFormat.SHORT en lugar de DEFAULT.

O posiblemente, intente analizar con CORTO, y luego pruebe con otros formatos si eso no funciona.

1

Puede analizar esta fecha usando SimpleDateFormat pero cómo determinará que fue 1911 o 2011 o cualquier otra cosa. debe usar el formato de año como aaaa.

+0

Dile eso a nuestros usuarios :) –

1

Si utiliza GWT, usted no tiene acceso a SimpleDateFormat, asi que aquí hay algo de código para hacerlo de forma manual:

String[] parts = dateText.split(" "); 

// Convert 2 digit date to 4 digits 
if (parts.length == 3 && parts[2].length() == 2) { 
    int year = Integer.valueOf(parts[2]); 

    // Allow 5 years in the future for a 2 digit date 
    if (year + 100 > new Date().getYear()+5) { 
     year = year + 1900; 
    } 
    else { 
     year = year + 2000; 
    } 
    dateText = parts[0] + " " + parts[1] + " " + String.valueOf(year); 
} 

Esto supone que ha validado que el dateText se separa con espacios.

0

Una aproximación:

int twoDigitYear = 11; 
int fourDigitYear = 0; 
DateTime now = new DateTime(); 

if (twoDgYear + 2000 > now().getYear()) { 
    fourDigitYear = twoDigitYear + 1900; 
}else{ 
    fourDigitYear = twoDigitYear + 2000; 
} 

pueden o no adaptarse a su necesidad ...

Cuestiones relacionadas