obtener - new date string java
Convierta java.util.Date a String en formato aaaa-MM-dd sin crear muchos objetos (5)
Necesito convertir java.util.Date
a String
en formato yyyy-MM-dd
en grandes cantidades.
Me acabo de mudar a java 8 y quiero saber cómo hacerlo correctamente. Mi solución con Java 7 fue como:
DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT_PATTERN)
DATE_FORMATTER.print(value.getTime())
Me ayudó a no crear muchos objetos redundantes.
Así que ahora, cuando me mudé a Java 8, quiero reescribirlo correctamente pero:
LocalDate.fromDateFields(value).toString())
crea cada vez un nuevo objeto LocalDate
y esto le da mucho trabajo a GC.
¿Hay alguna manera de resolver mi problema? El rendimiento y la seguridad de los hilos son muy importantes.
Después de algunas pruebas, descubrí que incluso al crear nuevos objetos con:
new SimpleDateFormat("yyyy-MM-dd")).format(value))
El más rápido en todo este tema.
Lo siguiente solo tiene una sobrecarga para la conversión de la fecha antigua a la nueva fecha local.
Date date = new Date();
LocalDate ldate = LocalDate.from(date.toInstant().atZone(ZoneOffset.UTC));
String s = DateTimeFormatter.ISO_DATE.format(ldate); // uuuu-MM-dd
Sin embargo, es cierto que los DateTimeFormatters son seguros para subprocesos y, por lo tanto, tendrán una instanciación más por llamada.
PD
.atZone(ZoneOffset.UTC)
debido a una excepción reportada, y la solución de @ Flown: especificando la zona. Como la Date
no se usa necesariamente para las fechas UTC, se podría usar otra.
No tengo números exactos desde el punto de vista del rendimiento, pero usaría Java 8 Time API para resolver este problema. En su caso especial usaría la siguiente declaración:
LocalDate.now().format(DateTimeFormatter.ISO_DATE);
EDITAR: Para esta solución es una conversión de java.util.Date
a java.time.LocalDate
required!
new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Sin crear muchos objetos, ¿quiere decir que quiere la versión de rendimiento?
public static String getIsoDate(java.util.Date time) {
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime(time);
StringBuilder sb = new StringBuilder();
int year = cal.get(java.util.Calendar.YEAR);
int month = cal.get(java.util.Calendar.MONTH) + 1;
int day = cal.get(java.util.Calendar.DAY_OF_MONTH);
sb.append(year);
sb.append(''-'');
if (month < 10) {
sb.append(''0'');
}
sb.append(month);
sb.append(''-'');
if (day < 10) {
sb.append(''0'');
}
sb.append(day);
return sb.toString();
}
Esta versión es segura para subprocesos y evita la mayoría de las creaciones de objetos ocultos, y a menos que tenga años menores de 1000 o más de 9999, se imprimirá bien.
Utilice SimpleDateFormat para formatear la fecha.
Tenga cuidado, SDF NO ESTÁ HILO-SEGURO , puede que no sea importante, pero tenga eso en cuenta.
Por ejemplo:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println((sdf.format(new Date())).toString());
LINK con más información.
puede usar la anotación @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") en su campo.