online example dates create java date jodatime

java - example - jodatime difference between dates



Joda Time analiza una fecha con zona horaria y conserva esa zona horaria (4)

tl; dr

OffsetDateTime.parse ( "30 11 2012 12:08:56.235 +0700" , DateTimeFormatter.ofPattern ( "dd MM uuuu HH:mm:ss.SSS X" , Locale.US ) ).toString()

2012-11-30T12: 08: 56.235 + 07: 00

Detalles

La respuesta aceptada es correcta. Tan pronto como convierte a un objeto java.util.Date , pierde la información de la zona horaria. Esto se complica por el hecho de que java.util.Date::toString aplica confusamente una zona horaria predeterminada actual al generar la cadena.

Evite utilizar estas antiguas clases de fecha y hora como java.util.Date . Están mal diseñados, son confusos y problemáticos. Ahora legado, suplantado por el proyecto java.time. Lo mismo ocurre con el proyecto Joda-Time que ahora está suplantado por las clases java.time.

java.time

Analice esa cadena de entrada como un objeto OffsetDateTime ya que incluye un offset-from-UTC pero carece de una zona horaria. Llame a DateTimeFormatter.ofPattern para especificar un formato personalizado que coincida con su cadena de entrada. Pase el objeto formateador a OffsetDateTime.parse .

String input = "30 11 2012 12:08:56.235 +0700" ; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd MM uuuu HH:mm:ss.SSS X" , Locale.US ); OffsetDateTime odt = OffsetDateTime.parse ( input , f );

odt: toString (): 2012-11-30T12: 08: 56.235 + 07: 00

Para ver el mismo momento en UTC, extrae un Instant . La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).

Instant instant = odt.toInstant();

instant.toString (): 2012-11-30T05: 08: 56.235Z

Puede aplicar cualquier zona horaria a través de la cual desea ver el mismo momento, el mismo punto en la línea de tiempo.

ZonedDateTime zdtKolkata = odt.toInstant ().atZone ( ZoneId.of ( "Asia/Kolkata" ) );

zdtKolkata.toString (): 2012-11-30T10: 38: 56.235 + 05: 30 [Asia / Calcuta]

No hay necesidad de mezclar en las antiguas clases de fecha y hora en absoluto. Quédate con java.time. Si debe usar algún código antiguo que aún no se haya actualizado a los tipos java.time, busque los nuevos métodos agregados a las clases antiguas para convertir a / desde java.time.

El equivalente de java.util.Date es Instant , ambos son una cuenta desde la fecha 1970-01-01T00:00:00Z en UTC. Pero tenga cuidado con la pérdida de datos, ya que las clases java.time admiten una resolución de nanosegundos, pero las clases antiguas están limitadas a milisegundos.

java.util.Date utilDate = java.util.Date.from( instant );

Código en vivo

Ver código de trabajo en vivo en IdeOne.com .

Acerca de java.time

El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date , .Calendar , & 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 busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API de Java estándar con una implementación en paquete.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver cómo usar ...

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval , YearWeek , YearQuarter , y more .

Quiero analizar una fecha, que se creó con una zona horaria específica, convertirla a un formato y devolverla. La conversión funciona, pero el desplazamiento de la zona horaria siempre se establece en +0000 y la diferencia de tiempo se agrega / resta según sea necesario. ¿Cómo puedo hacer que se formatee y mantenga el desplazamiento correcto?

Espero esto: 2012-11-30T12: 08: 56.23 + 07: 00

Pero obtén esto: 2012-11-30T05: 08: 56.23 + 00: 00

Implementación:

public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd''T''HH:mm:ss.SSZZ"; public static String formatDateToISO8601Standard(Date date) { DateTime dateTime = new DateTime(date); DateTimeFormatter df = DateTimeFormat.forPattern(ISO_8601_DATE_FORMAT); return dateTime.toString(df); }

Clase de prueba

private static final String DATE_WITH_TIMEZONE = "30 11 2012 12:08:56.235 +0700"; private static final String EXPECTED_DATE_WITH_TIMEZONE = "2012-11-30T12:08:56.23+07:00"; @Test public void testFormattingDateWithSpecificTimezone() throws Exception { String result = JodaDateUtil.formatDateToISO8601Standard(createDate(DATE_WITH_TIMEZONE)); assertEquals("The date was not converted correctly", EXPECTED_DATE_WITH_TIMEZONE, result); } private Date createDate(String dateToParse) throws ParseException { DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z"); DateTime temp = df.parseDateTime(dateToParse); Date date = temp.toDate(); return date; }


Básicamente, una vez que analiza la cadena de fecha [en su método createDate ()], perdió la zona original. Joda-Time le permitirá formatear la fecha utilizando cualquier zona, pero deberá conservar la zona original.

En su método createDate (), el DateTimeFormatter "df" puede devolver la zona que estaba en la cadena. Tendrá que usar el método withOffsetParsed() . Luego, cuando tenga su DateTime , llame a getZone() . Si guarda esta zona en algún lugar o de alguna manera la transfiere a su rutina de formateo, entonces puede usarla creando un DateTimeFormatter "withZone" y especificando esa zona como la que desea en el formato.

Como demostración, aquí hay algunos ejemplos de código en un solo método. Con suerte, ayudará a cambiar tu código de la forma en que quieres que se ejecute.

public static void testDate() { DateTimeFormatter df = DateTimeFormat.forPattern("dd MM yyyy HH:mm:ss.SSS Z"); DateTime temp = df.withOffsetParsed().parseDateTime("30 11 2012 12:08:56.235 +0700"); DateTimeZone theZone = temp.getZone(); Date date = temp.toDate(); DateTime dateTime = new DateTime(date); DateTimeFormatter df2 = DateTimeFormat.forPattern("yyyy-MM-dd''T''HH:mm:ss.SSZZ"); DateTimeFormatter df3 = df2.withZone(theZone); System.out.println(dateTime.toString(df2)); System.out.println(dateTime.toString(df3)); }


Prueba esto.

ISODateTimeFormat.dateTimeParser().parseDateTime(dateString),

luego convertirlo al formato que desee.


Use el formato val formatter = DateTimeFormat.forPattern ("aaaa-MM-dd HH: mm: ss.SSSZZ")