tl; dr
Instant.ofEpochMilli( 1_317_816_735_000L )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )
…además…
LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
java.time
La Pregunta y la mayoría de las Respuestas utilizan clases de fecha y hora obsoletas de las primeras versiones de Java. Estas viejas clases han demostrado ser problemáticas y confusas. Evítales. En su lugar, use las clases java.time.
ISO 8601
Su cadena de entrada tiene casi el formato estándar ISO 8601. Simplemente reemplace el ESPACIO en el medio con un T
.
String input = "2011-10-06 03:35:05".replace( " " , "T" );
LocalDateTime
Ahora analice como a LocalDateTime
porque la entrada carece de información sobre el desplazamiento desde UTC o la zona horaria. A LocalDateTime
no tiene concepto de desplazamiento ni de zona horaria, por lo que no representa un momento real en la línea de tiempo.
LocalDateTime ldt = LocalDateTime.parse( input );
ZoneOffset
Parece estar diciendo que, desde el contexto empresarial, sabe que la intención de esta cadena es representar un momento 13 horas antes de UTC. Así que instanciamos a ZoneOffset
.
ZoneOffset offset = ZoneOffset.ofHours( 13 );
OffsetDateTime
Aplicarlo para obtener un OffsetDateTime
objeto. Este se convierte en un momento real en la línea de tiempo.
OffsetDateTime odt = ldt.atOffset( offset);
ZoneId
Pero luego mencionas Nueva Zelanda. Así que tenías en mente una zona horaria específica. Una zona horaria es un desfase de UTC más un conjunto de reglas para manejar anomalías como el horario de verano (DST). Por tanto, podemos especificar un ZoneId
a un en ZonedDateTime
lugar de un simple desplazamiento.
Especifique un nombre de zona horaria adecuado . Nunca use la abreviatura de 3-4 letras como EST
o IST
ya que no son zonas horarias verdaderas, no están estandarizadas y ni siquiera son únicas (!). Por ejemplo Pacific/Auckland
,.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime
Aplicar el ZoneId
.
ZonedDateTime zdt = ldt.atZone( z );
Puede ajustarse fácilmente a otra zona para el mismo momento en la línea de tiempo.
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
Contar desde la época
Recomiendo encarecidamente no manejar los valores de fecha y hora como un recuento de la época, como milisegundos desde el comienzo de 1970 UTC. Pero si es necesario, cree un a Instant
partir de ese número.
Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );
Luego asigne una zona horaria como se ve arriba, si lo desea, para alejarse de UTC.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );
Tu valor de 1_317_816_735_000L
es:
2011-10-05T12:12:15Z
(Mié, 05 de Octubre de 2011 12:12:15 GMT)
2011-10-06T01:12:15+13:00[Pacific/Auckland]
(Jueves 06 de octubre de 2011 01:12:15 en Auckland Nueva Zelanda).
Generar cadenas
Para generar una cadena en formato estándar ISO 8601 , simplemente llame toString
. Tenga en cuenta que ZonedDateTime
prudentemente amplía el formato estándar agregando el nombre de la zona horaria entre corchetes.
String output = zdt.toString();
Para otros formatos, busque Stack Overflow para la DateTimeFormatter
clase. Ya cubierto muchas veces.
Especifique ay FormatStyle
a Locale
.
Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );
Tenga en cuenta que la zona horaria no tiene nada que ver con la configuración regional. Puede hacer que Europe/Paris
se muestre una fecha y hora en el idioma japonés y las normas culturales, o una Asia/Kolkata
fecha y hora en el idioma portugués y las normas culturales de Brasil.
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases sustituyen a las clases de fecha y hora viejas problemáticas tales como java.util.Date
, .Calendar
, y java.text.SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time.
Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.
Gran parte de la funcionalidad de java.time se ha actualizado a Java 6 y 7 en ThreeTen-Backport y se ha adaptado aún más a Android en ThreeTenABP (consulte Cómo utilizar… ).
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y mucho más.