2016-01-05 12 views
16

Ho un tempo con tipo di stringa: "2015-01-05 17:00" e ZoneId è "Australia/Sydney".Java 8 Convertire l'ora e il fuso orario specificati nell'ora UTC

Come posso convertire queste informazioni temporali nell'ora UTC corrispondente utilizzando l'API datetime Java 8?

Inoltre, è necessario considerare le cose relative all'ora legale.

+1

Cosa intendi per "Ora UTC"? Vuoi un istantaneo? o un java.sql.Date? O un certo numero di millisimali dall'epoca? – assylias

risposta

32

Stai cercando la classe ZonedDateTime in Java8 - una data-ora completa con fuso orario e offset risolto da UTC/Greenwich. In termini di design, questa classe deve essere vista principalmente come combinazione di uno LocalDateTime e uno ZoneId. Lo ZoneOffset è un'informazione vitale, ma secondaria, utilizzata per garantire che la classe rappresenti un istante, in particolare durante una sovrapposizione dell'ora legale.

Ad esempio:

ZoneId australia = ZoneId.of("Australia/Sydney"); 
String str = "2015-01-05 17:00"; 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter); 
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia); 

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney); 

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); 

System.out.println("Current date and time in UTC : " + utcDate); 
+1

Sembra che questo risultato non sia quello che voglio. Voglio convertire l'ora UTC e memorizzare l'ora UTC nel mio database. ZonedDateTime non è quello che voglio e non può associare al tipo di colonna DB. – ttt

+2

Spiacente di aver aggiunto la conversione a UTC nell'esempio. –

+2

Fresco, sembra che dobbiamo convertire LocalDateTime in ZonedDateTime e quindi possiamo eseguire la conversione tra diversi fusi orari. Grazie. – ttt

15

Un'alternativa alla risposta attuale è quello di impostare il formattatore con il fuso orario appropriato:

String input = "2015-01-05 17:00"; 
ZoneId zone = ZoneId.of("Australia/Sydney"); 

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone); 
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC); 

Dal momento che si desidera interagire con un database, potrebbe essere necessario a java.sql.Timestamp, nel qual caso non è necessario convertire in modo esplicito in un'ora UTC, ma è possibile utilizzare invece un Instant:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); 
Timestamp sqlTs = Timestamp.from(zdt.toInstant()); 
+0

Qual è la variabile UTC in questo contesto? – BOWS

+1

È una data/ora, nel fuso orario UTC, che corrisponde allo stesso istante di "input" a Sydney. Quindi, in questo caso, sarà la stessa data, ma alle 6 del mattino. – assylias

0
**// Refactored Logic**  

     ZoneId australia = ZoneId.of("Australia/Sydney"); 
     ZoneId utcZoneID= ZoneId.of("Etc/UTC"); 
     String ausTime = "2015-01-05 17:00"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 

     //converting in datetime of java8 
     LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter); 

     // DateTime With Zone 
     ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID); 
     // output - 2015-01-05T17:00Z[Etc/UTC] 

     // With Formating DateTime 
     String utcDateTime = utcDateAndTime.format(formatter); 
     // output - 2015-01-05 17:00