zona tengo que pongo permiso horaria hora configurar como cambiar automaticamente actualizar java datetime formatting timezone jsr310

tengo - ¿Cómo formato un javax.time.Instant como una cadena en la zona horaria local?



como configurar la hora de mi pc windows 7 (4)

¿Cómo formato un javax.time.Instant como una cadena en la zona horaria local? Lo siguiente traduce un Instant local a UTC , no a la zona horaria local como estaba esperando. La eliminación de la llamada a toLocalDateTime() hace lo mismo. ¿Cómo puedo obtener la hora local en su lugar?

public String getDateTimeString( final Instant instant ) { checkNotNull( instant ); DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); DateTimeFormatter formatter = builder.appendPattern( "yyyyMMddHHmmss" ).toFormatter(); return formatter.print( ZonedDateTime.ofInstant( instant, TimeZone.UTC ).toLocalDateTime() ); }

Nota: Estamos utilizando la versión anterior 0.6.3 de la implementación de referencia JSR-310 .


¿Por qué esperas que use la zona horaria local? Estás pidiendo explícitamente UTC:

ZonedDateTime.ofInstant(instant, TimeZone.UTC)

Simplemente especifique su zona horaria local en su lugar:

ZonedDateTime.ofInstant(instant, TimeZone.getDefault())


Prueba esto:

String dateTime = DateTimeFormatter.ISO_ZONED_DATE_TIME.format( ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()) );

Esto da:

2014-08-25T21:52:07-07:00[America/Los_Angeles]

Puede cambiar el formato utilizando algo que no sea DateTimeFormatter.ISO_ZONED_DATE_TIME como formateador. DateTimeFormatter tiene un montón de formateadores predefinidos, o puede definir el suyo propio.


Respondiendo a esta pregunta con la versión casi terminada de JDK1.8

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.systemDefault()); return formatter.format(instant);

La clave es que Instant no tiene información de zona horaria. Por lo tanto, no se puede formatear utilizando patterns basados ​​en campos de fecha / hora, como "aaaaMMddHHmmss". Al especificar la zona en DateTimeFormatter , el instante se convierte en la zona horaria especificada durante el formateo, lo que permite que se emita correctamente.

Un enfoque alternativo es convertir a ZonedDateTime :

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); return formatter.format(ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()));

Ambos enfoques son equivalentes, sin embargo, generalmente elegiría el primero si mi objeto de datos fuera Instant .


Antes de que vote mi respuesta, tenga en cuenta que la pregunta explícitamente (y en negrita) se refiere a la versión anterior 0.6.3 de la implementación de referencia JSR-310. Hice esta pregunta en diciembre de 2012, mucho antes de la llegada de Java 8 y la nueva biblioteca de fechas.

ZonedDateTime clases JSR-310 DateTimeFormatter y ZonedDateTime y en su lugar recurrí a los antiguos java.util.Date y java.text.SimpleDateFormat :

public String getDateTimeString( final Instant instant ) { checkNotNull( instant ); DateFormat format = new SimpleDateFormat( "yyyyMMddHHmmss" ); Date date = new Date( instant.toEpochMillisLong() ); return format.format( date ); }