Ten en cuenta que en las ciencias informáticas un problema casi siempere suele tener diversas resoluciones, así que nosotros enseñamos lo más óptimo y eficiente.
Solución:
Esto funcionó para mí:
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
2018-10-03T07:24:14.772+03:00
2018-10-03T07:24:14.772+03:00
Aunque no siempre producirá el mismo resultado porque ISO_OFFSET_DATE_TIME imprime una fracción de segundo con una longitud diferente según el valor de los nanos, mientras que .SSS tiene una longitud fija = 3
ZonedDateTime dateTime = ZonedDateTime.of(2001, 1, 1, 0, 0, 0, 1, ZoneId.systemDefault());
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
2001-01-01T00:00:00.000+02:00
2001-01-01T00:00:00.000000001+02:00
No, esto no es posible.
Bajo pedido: Sí, sabemos que no existe un patrón de formato equivalente string de DateTimeFormatter.ISO_OFFSET_DATE_TIME
.
DateTimeFormatter.ISO_OFFSET_DATE_TIME
omite los segundos y/o nano de segundo si son cero. Si los nanos son distintos de cero, “se generarán tantos dígitos como sea necesario”. No hay una letra de patrón o una combinación de letras de patrón que le proporcione el mismo comportamiento.
En lo más profundo DateTimeFormatter
, ISO_OFFSET_DATE_TIME
usa un ISO_LOCAL_TIME
que a su vez se define de esta manera:
ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendFraction(NANO_OF_SECOND, 0, 9, true)
.toFormatter(ResolverStyle.STRICT, null);
Cuál es la forma de obtener el comportamiento dinámico: usando un DateTimeFormatterBuilder
y es optionalStart
y appendFraction
métodos.
Aparte, no desea copiar el comportamiento de ISO_OFFSET_DATE_TIME
exactamente. Deberá utilizar el formateador incorporado.