2012-09-19 12 views
17

Mam znacznik czasu, który jest w UTC i chcę go przekonwertować na czas lokalny bez korzystania z połączenia API, takiego jak TimeZone.getTimeZone("PST"). Jak dokładnie masz to zrobić? Używam następujący kod bez większego sukcesu: wartość wejściowąJava: Jak przekonwertować sygnaturę czasową UTC na czas lokalny?

private static final SimpleDateFormat mSegmentStartTimeFormatter = new  SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 

Calendar calendar = Calendar.getInstance(); 

    try { 
     calendar.setTime(mSegmentStartTimeFormatter.parse(startTime)); 
    } 
    catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return calendar.getTimeInMillis(); 

Próbka: [2012-08-15T22:56:02.038Z]

powinien zwrócić równowartość [2012-08-15T15:56:02.038Z]

Odpowiedz

38

Date ma strefę czasową i wewnętrznie sklepów w UTC. Tylko w przypadku sformatowania daty obowiązuje korekta strefy czasowej. Podczas korzystania z DateFormat domyślnie jest to strefa czasowa JVM, w której działa. Zmień ją, jeśli to konieczne, za pomocą setTimeZone.

DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date date = utcFormat.parse("2012-08-15T22:56:02.038Z"); 

DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
pstFormat.setTimeZone(TimeZone.getTimeZone("PST")); 

System.out.println(pstFormat.format(date)); 

Drukuje 2012-08-15T15:56:02.038

Zauważ, że wyszedłem na zewnątrz 'Z' w formacie PST, ponieważ wskazuje UTC. Jeśli po prostu poszedł z Z to wyjście byłoby 2012-08-15T15:56:02.038-0700

+5

Chłodny to faktycznie działało. Udało mi się uzyskać domyślną strefę czasową urządzenia z systemem Android, wywołując funkcję TimeZone.getDefault(). –

0

Oto prosty Zmodyfikowany roztwór

public String convertToCurrentTimeZone(String Date) { 
      String converted_date = ""; 
      try { 

       DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 

       Date date = utcFormat.parse(Date); 

       DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone())); 

       converted_date = currentTFormat.format(date); 
      }catch (Exception e){ e.printStackTrace();} 

      return converted_date; 
    } 


    //get the current time zone 

    public String getCurrentTimeZone(){ 
      TimeZone tz = Calendar.getInstance().getTimeZone(); 
      System.out.println(tz.getDisplayName()); 
      return tz.getID(); 
    } 
+0

To zwraca czas UTC, który chcę przekonwertować na czas lokalny !!!! – ArhatBaid

2

pomocą nowoczesnego data Java & czas API, a to jest bardzo proste:

String inputValue = "2012-08-15T22:56:02.038Z"; 
    Instant timestamp = Instant.parse(inputValue); 
    ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles")); 
    System.out.println(losAngelesTime); 

To drukuje

Punkty do uwaga:

  • Jest trochę błędów w twoich oczekiwań. Oznaczenie Z w twoim sygnale czasowym oznacza czas UTC, znany również jako czas Zulu. Więc w twojej lokalnej wartości czasu nie powinno tam być Z. Zamiast tego potrzebujesz wartości zwracanej, na przykład 2012-08-15T15:56:02.038-07:00, ponieważ przesunięcie wynosi teraz -7 godzin zamiast Z.
  • Należy unikać skrótów w strefie czasowej trzech liter. Nie są one ustandaryzowane, a zatem najczęściej niejednoznaczne. PST na przykład może oznaczać czas standardowy Philppine, czas pacyficzny standardowy lub czas standardowy Pitcairn (chociaż S w skrócie jest często na czas letni (czyli DST)). Jeśli planujesz Pacyficzny czas standardowy, nie jest to nawet strefa czasowa, ponieważ w lecie (gdy przykładowy znacznik czasu spada), używany jest Pacyficzny czas letni. Zamiast skrótów należy używać identyfikatorów stref czasowych w formacie region/miasto jak w moim kodzie.
  • Znaczniki czasu są zwykle najlepiej traktowane jako obiekty Instant. Konwertuj na ZonedDateTime tylko wtedy, gdy potrzebujesz, na przykład do prezentacji.

Pytanie: Czy mogę korzystać z nowoczesnego API z moją wersją Java?

Jeśli używasz co najmniej Java , możesz.

  • W języku Java 8 i nowszych wersjach wbudowany jest nowy interfejs API.
  • W języku Java 6 i 7 otrzymuje the ThreeTen Backport, protokół z nowymi klasami (to ThreeTen dla JSR-310, w którym po raz pierwszy zdefiniowano nowoczesny interfejs API).
  • W systemie Android, użyj edycji Android ThreeTen Backport. Nazywa się ThreeTenABP i myślę, że jest wspaniałe wyjaśnienie w this question: How to use ThreeTenABP in Android Project.
Powiązane problemy