2016-12-21 37 views
6

Mam wartość daty w dniu 2016-12-21T07: 48: 36 z przesunięciem UTC + 14. Jak przekonwertować datetime na równoważny standardowy czas GMT.Jak przekonwertować wartość daty z przesunięciem UTC na GMT w java 7

Próbowałem z metodą sampleDateFormat.parse().Ale nie jestem w stanie uzyskać obiektu TimeZone dla przesunięcia UTC jak.

sampleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC+14:00")) 

Proszę mi pomóc w konwersji UTC datetime do standardowego czasu GMT w Javie 7.

+0

Twój problem polega na tym, że użyłeś nieobsługiwanego "UTC + 14". getTimeZone zna tylko formularz "GMT + xx" – Sxilderik

+0

Skąd otrzymałeś przesunięcie ** + 14 **? –

Odpowiedz

2

będzie Zakładam, że masz oryginalną datę jako ciąg. Wykonaj następujące czynności:

  • Tworzenie SimpleDateFormat i ustawić strefę czasową, aby "GMT + 14"
  • analizowania wartość ciągu. Dostajesz Date obiekt
  • Ustaw strefę czasową, w SimpleDateFormat do „UTC” (lub użyć innego SimpleDateFormat instancji)
  • Format data (jeśli chcesz wynik jako ciąg jak dobrze)

Przykład:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class ConvertToUTC { 
    public static void main(String[] args) throws Exception { 

     String dateval = "2016-12-21T07:48:36"; 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     df.setTimeZone(TimeZone.getTimeZone("GMT+14")); 
     Date date = df.parse(dateval); 

     System.out.println(df.format(date)); // GMT+14 

     df.setTimeZone(TimeZone.getTimeZone("UTC")); 
     System.out.println(df.format(date)); // UTC 
    } 
} 
+0

Czy komponent oszczędzający światło dzienne będzie brany pod uwagę, jeśli użyjemy przesunięcia GMT + zamiast przesunięcia UTC +? – GOPI

+0

@GOPI Odpowiedź jest poprawna. Twoje pytanie wspomina tylko o stałych przesunięciach (i jest równe, jeśli prefiks to GMT lub UTC). Tak więc oszczędność światła dziennego jest nieistotna w kontekście twojego pytania.W przeciwnym razie nie używaj stałych przesunięć, ale identyfikatorów stref czasowych, takich jak "Azja/Tokio" itp. –

+0

Dzięki Meno i Grodriguez! – GOPI

2

użycie "GMT + 14: 00" zamiast "UTC + 14: 00"

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); 
f.setTimeZone(TimeZone.getTimeZone("GMT+14:00")); 
final Date d = f.parse("2016-12-21T07:48:36"); 
f.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(f.format(d)); // -> 2016-12-20T05:48:36 
2

tl; dr

LocalDateTime.parse("2016-12-21T07:48:36")  // Parse as a `LocalDateTime` given the lack of an offset or zone. *Not* an actual moment, only a rough approximation of potential moments along a range of about 26-27 hours. 
      .atOffset(ZoneOffset.ofHours(14)) // Assign an offset-from-UTC as context, giving meaning to determine an actual point on the timeline. 
      .toInstant()       // Renders `Instant` object in UTC. 

java.time

Nowoczesny sposób jest z klasami java.time wbudowanych w Java 8 i późniejszych. Duża część funkcji została przeniesiona do Java 6 & 7 w projekcie ThreeTen-Backport.

ZoneOffset offset = ZoneOffset.ofHours(14); // fourteen hours ahead of UTC. 

Analizować ciąg jako LocalDateTime gdyż brakuje jakichkolwiek informacji o przesunięcie lub strefy. Dane wejściowe są w standardowym formacie ISO 8601, więc nie trzeba określać wzorca formatowania.

LocalDateTime ldt = LocalDateTime.parse("2016-12-21T07:48:36"); 

Zastosuj przesunięcie do lokalnej daty i godziny, aby uzyskać obiekt OffsetDateTime.

OffsetDateTime odt = ldt.atOffset(offset); 

tym, wyodrębnić Instant która jest zawsze w UTC.

Instant instant = odt.toInstant(); 

instant.toString(): 2016-12-20T17: 48: 36Z

W UTC wartość jest inna data, 20. zamiast 21.

Zobacz live code at IdeOne.com.


O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Używanie JDBC driver zgodny z JDBC 4.2 lub później, można wymieniać java.time obiekty bezpośrednio z bazy danych. Nie ma potrzeby ciągi ani klas java.sql. *.

Gdzie można uzyskać lekcje java.time?

  • Java SE 8, Java SE 9, a później
    • wbudowanej.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
  • Android
    • Późniejsze wersje Androida wdrożeń wiązce klas java.time.
    • Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.

+0

Z technicznego punktu widzenia 'Instant' nie jest" w "żadnej strefie czasowej. Jest to przesunięcie względem epoki. – OrangeDog

+2

@OrangeDog Niepoprawnie. 'Instant' jest z pewnością w UTC. Aby zacytować dokument klasy: "Epoka-sekundy są mierzone od standardowej epoki Java z 1970-01-01T00: 00: 00Z". To 'Z' jest skrótem od Zulu i oznacza UTC. Bez zdefiniowania jako UTC "Instant" nie miałoby znaczenia. –

+0

Tylko dlatego, że reprezentacja epoki w dokumencie jest w Z, nie oznacza, że ​​'Instant' jest. Zacytować dokument klasy: "ten Java API definiuje swoją własną skalę czasu, Skalę czasu Java". – OrangeDog