zoneid new localdatetime example java datetime timezone

new - Fecha de conversión TimeZone en Java?



zoneddatetime to localdatetime (5)

Estaba buscando la forma más sencilla de convertir una fecha, una vez, de GMT a mi hora local. Por supuesto, tener las fechas de horario de verano adecuadas consideradas y lo más estándar posible.

El código más sencillo que pude encontrar fue:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String inpt = "2011-23-03 16:40:44"; Date inptdate = null; try { inptdate = sdf.parse(inpt); } catch (ParseException e) {e.printStackTrace();} Calendar tgmt = new GregorianCalendar(TimeZone.getTimeZone("GMT")); tgmt.setTime(inptdate); Calendar tmad = new GregorianCalendar(TimeZone.getTimeZone("Europe/Madrid")); tmad.setTime(inptdate); System.out.println("GMT:/t/t" + sdf.format(tgmt.getTime())); System.out.println("Europe/Madrid:/t" + sdf.format(tmad.getTime()));

Pero creo que no obtuve el concepto correcto de lo que getTime devolverá.


Para la entrada, simplemente puede agregar la zona horaria a la cadena (tenga en cuenta la ''z'' en el formato):

new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss z").parse ("2011-23-03 16:40:44 GMT");



La forma más sencilla es utilizar una biblioteca decente de fecha y hora en lugar de las notoriamente problemáticas clases java.util.Date y .Calendar. En su lugar, utilice Joda-Time o el paquete java.time que se encuentra en Java 8.

Joda-Time

String input = input.replace( " ", "T" ).concat( "Z" ) ; // proper ISO 8601 format for a date-time in UTC. DateTimeZone timeZone = DateTimeZone.forID( "Europe/Madrid" ); DateTime dateTime = new DateTime( input, timeZone ); String output = dateTime.toString();


El problema aquí es que la clase DateFormat tiene una zona horaria. Pruebe este ejemplo en su lugar:

SimpleDateFormat sdfgmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdfgmt.setTimeZone(TimeZone.getTimeZone("GMT")); SimpleDateFormat sdfmad = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdfmad.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); String inpt = "2011-23-03 16:40:44"; Date inptdate = null; try { inptdate = sdfgmt.parse(inpt); } catch (ParseException e) {e.printStackTrace();} System.out.println("GMT:/t/t" + sdfgmt.format(inptdate)); System.out.println("Europe/Madrid:/t" + sdfmad.format(inptdate));


Aquí está la respuesta 2017.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String inpt = "2011-03-23 16:40:44"; ZonedDateTime madridTime = LocalDateTime.parse(inpt, dtf) .atOffset(ZoneOffset.UTC) .atZoneSameInstant(ZoneId.of("Europe/Madrid")); System.out.println("GMT:/t/t" + inpt); System.out.println("Europe/Madrid:/t" + madridTime.format(dtf));

Por favor, disfrute de cuánto más naturalmente este código expresa la intención.

El código imprime

GMT: 2011-03-23 16:40:44 Europe/Madrid: 2011-03-23 17:40:44

(con un tamaño de tabulación de 8 se alinea muy bien, pero parece aplicar un tamaño de tabulación de 4).

Cambié 23 y 03 en tu cadena de entrada, creo que tu intención era esto. Por cierto, no fui yo quien captó tu error, fue LocalDateTime.parse() lanzando una excepción porque no hay un mes número 23. También a este respecto, las clases modernas son más útiles que las obsoletas.

Joda-Time? La respuesta de Basil Bourque menciona y recomienda tanto java.time , que estoy usando, como Joda-Time. Si bien Joda-Time ya es una mejora considerable en comparación con las clases desactualizadas utilizadas en la pregunta ( SimpleDateFormat , Calendar , GregorianCalendar ), ahora está en modo de mantenimiento; no se espera un mayor desarrollo adicional. java.time está enormemente inspirado por Joda-Time. Para el nuevo código, no veo ninguna razón por la cual no deberías preferir java.time .