java - tipos - ¿Cuál es la mejor manera de analizar una fecha en formato MM/DD/YY y ajustarla al siglo actual/anterior?
formato fecha excel (7)
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 SimpleDateFormat analizar el String y simplemente ajustar el año para ser el siglo anterior si SimpleDateFormat ( que tiene sus propias reglas para interpretar 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 da cuenta de ninguna fecha que pueda analizarse como antes del siglo pasado; por ejemplo, con el formato MM/dd/yyyy
, una cadena de fecha como "01/11/12" analiza al 11 de enero de 12 AD
Uno de nuestros clientes desea poder ingresar una fecha con solo 2 dígitos para el componente anual. La fecha estará en el pasado, por lo que queremos que funcione durante el siglo anterior si el año de 2 dígitos es posterior al año actual, pero funciona 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 que hay 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;
}
Script Groovy (lo suficientemente fácil de lanzar en Java) que demuestra el punto @bobince hecho sobre SimpleDateFormat.
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(''MM/dd/yy'')
java.text.SimpleDateFormat fmt = new java.text.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))
}
Yeilds
2001-01-01
2008-10-30
1909-01-01
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 forma parte de Java SE, y como he dicho en otro hilo, generalmente no apruebo 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 liderará JSR310, la API de fecha y hora que lo convertirá en Java 7. Así que Joda Time va a ser básicamente en futuras versiones de Java.
SimpleDateFormat ya hace un análisis anual de dos dígitos para usted, utilizando el formato ''yy'' de dos letras. (Todavía permitirá cuatro dígitos, obviamente).
Por defecto, usa now-80 → now + 20, por lo que no es exactamente la misma regla que usted propone, pero es razonable y estandarizado (al menos en el mundo Java), y puede anularse usando set2DigitYearStart () si lo desea.
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 es probable que cause problemas con el tiempo.
La mejor forma es usar Joda Time API para fechas y horas en Java.
Date deliverDate = new SimpleDateFormat("MM/dd/yy").parse(deliverDateString);
String dateString2 = new SimpleDateFormat("yyyy-MM-dd").format(deliverDate);
Trabajando para mi
Pivot Year en Joda-Time
La excelente biblioteca Joda-Time 2.5 incluye esta funcionalidad. No es necesario que escriba ningún código usted mismo. Simplemente llame withPivotYear()
en un DateTimeFormatter
. Consulte ese documento vinculado para ver ejemplos de cómo usarlo.