¿Cuál es la mejor manera de analizar una fecha en formato MM / DD / YY y ajustarla al siglo actual / anterior?

StackOverflow https://stackoverflow.com/questions/251535

  •  05-07-2019
  •  | 
  •  

Pregunta

Uno de nuestros clientes desea poder ingresar una fecha con solo 2 dígitos para el componente del año. La fecha será anterior, por lo que queremos que funcione para el siglo anterior si el año de 2 dígitos es posterior al año actual, pero que funcione para el siglo actual si el año de 2 dígitos es igual o menor que el año actual.

a partir de hoy 30/10/2008

01/01/01 = 01/01/2001

01/01/09 = 01/01/1909

Este es un requisito extraño, y resolví el problema, simplemente no me gusta mi solución. Se siente como si hubiera una mejor manera de hacer esto.

Gracias por la ayuda.

public static String stupidDate(String dateString)
{
    String twoDigitYear = StringUtils.right(dateString, 2);
    String newDate = StringUtils.left(dateString, dateString.length() - 2);
    int year = NumberUtils.toInt(twoDigitYear);
    Calendar c = GregorianCalendar.getInstance();
    int centuryInt = c.get(Calendar.YEAR) - year;
    newDate = newDate + StringUtils.left(Integer.toString(centuryInt), 2) + twoDigitYear;
    return newDate;
}
¿Fue útil?

Solución

Script Groovy (lo suficientemente fácil de lanzar en java) que demuestra el punto que @bobince hizo acerca de SimpleDateFormat.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

Rendimientos

2001-01-01
2008-10-30
1909-01-01

Otros consejos

SimpleDateFormat ya está analizando el año con dos dígitos, usando las dos letras & # 8216; yy & # 8217; formato. (Todavía permitirá cuatro dígitos, obviamente).

De forma predeterminada, usa ahora -80 & # 8594; ahora + 20, por lo que no es exactamente la misma regla que usted propone, pero es razonable y está estandarizado (al menos en el mundo Java), y puede anularse usando set2DigitYearStart () si tu quieres.

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

A más largo plazo, intente migrar al formato de fecha ISO8601 (aaaa-MM-dd), porque MM / dd / aa es aproximadamente el peor formato de fecha posible y está obligado a causar problemas con el tiempo.

¿Qué tal esto?

public static String anEasierStupidDateWithNoStringParsing(String dateString) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    //handling ParseExceptions is an exercise left to the reader!
    Date date = df.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    Calendar now = Calendar.getInstance();
    if (cal.after(now)) {
        cal.add(Calendar.YEAR, -100);
    }

    return cal;
}

En otras palabras, deje que SimpleDateFormat analice la cadena y simplemente ajuste el año para que sea el siglo anterior si SimpleDateFormat ( que tiene sus propias reglas para interpretar las cadenas de año ) devuelve una fecha posterior a la fecha actual.

Esto garantizaría que todas las fechas devueltas estén en el pasado. Sin embargo, no tiene en cuenta las fechas que podrían analizarse como antes en el siglo pasado, por ejemplo, con el formato MM / dd / aaaa , una cadena de fecha como " 01/11/12 " analiza al 11 de enero, 12 A.D.

Si Joda Time es una opción:

String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
    dateTime = dateTime.minus(Years.ONE);
}

return dateTime.toString("MM/dd/yyyy");

Sé que Joda Time no es parte de Java SE, y como he dicho en otro hilo, por lo general no estoy de acuerdo con el uso de una biblioteca de terceros cuando hay una biblioteca de Java que hace lo mismo. Sin embargo, la persona que está desarrollando Joda Time también está liderando JSR310, la API de fecha y hora que se convertirá en Java 7. Por lo tanto, Joda Time estará básicamente en futuras versiones de Java.

Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);

Trabajando para mí.

Año de pivote en Joda-Time

La excelente biblioteca Joda-Time 2.5 incluye esta funcionalidad. No necesitas escribir ningún código tú mismo. Simplemente llame a withPivotYear () en DateTimeFormatter . Vea ese documento vinculado para ver ejemplos de cómo usarlo.

La mejor manera es usar la API de Joda Time para fechas y horas en Java.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top