jestem łączenie chór zalecający pominąć już dawno przestarzałych klas Date
, Calendar
, SimpleDateFormat
i przyjaciele. W szczególności ostrzegam przed użyciem przestarzałych metod i konstruktorów klasy Date
, takich jak użyty konstruktor Date(String)
. Były przestarzałe, ponieważ nie działały niezawodnie w różnych strefach czasowych, więc nie należy ich używać. I tak, większość konstruktorów i metod tej klasy jest przestarzała.
W czasie, gdy zadawałeś pytanie, Joda-Time był (z tego, co wiem) zdecydowanie lepszą alternatywą, czas znów się zmienił. Dzisiaj Joda-Time to w dużej mierze ukończony projekt, a jego twórcy zalecają zamiast tego używać java.time
, nowoczesnego interfejsu API daty i godziny Java. Pokażę ci jak.
ZonedDateTime localTime = ZonedDateTime.now(ZoneId.systemDefault());
// Convert Local Time to UTC
OffsetDateTime gmtTime
= localTime.toOffsetDateTime().withOffsetSameInstant(ZoneOffset.UTC);
System.out.println("Local:" + localTime.toString()
+ " --> UTC time:" + gmtTime.toString());
// Reverse Convert UTC Time to Local time
localTime = gmtTime.atZoneSameInstant(ZoneId.systemDefault());
System.out.println("Local Time " + localTime.toString());
Na początek, trzeba pamiętać, że nie tylko jest kod tylko w połowie tak długo, jak twoje, to jest także jaśniejsze czytać.
na moim komputerze drukuje kod:
Local:2017-09-02T07:25:46.211+02:00[Europe/Berlin] --> UTC time:2017-09-02T05:25:46.211Z
Local Time 2017-09-02T07:25:46.211+02:00[Europe/Berlin]
Wyszedłem na zewnątrz milisekund od epoki. Zawsze możesz uzyskać je od System.currentTimeMillis();
, tak jak w pytaniu, i są one niezależne od strefy czasowej, więc nie znalazłem tutaj interstingu.
Z wahaniem trzymałem zmienną nazwę localTime
. Myślę, że to dobre imię. Współczesny interfejs API ma klasę o nazwie LocalTime
, więc używanie tej nazwy nie jest pisane wielką literą, ponieważ obiekt, który nie ma typu LocalTime
może zmylić niektóre (a LocalTime
nie zawiera informacji o strefie czasowej, które musimy zachować tutaj jest w stanie dokonać prawidłowej konwersji, a także zawiera tylko porę dnia, a nie datę).
konwersji od czasu lokalnego UTC było błędne i niemożliwe
Przestarzała Date
klasa nie posiada żadnych informacji strefy czasowej (można powiedzieć, że zawsze używa wewnętrznie UTC), więc nie ma takiego coś jak konwersja Date
z jednej strefy czasowej na drugą. Kiedy tylko dostał swój kod na moim komputerze, to w pierwszej linii drukowanych, było:
Local:Sat Sep 02 07:25:45 CEST 2017,1504329945967 --> UTC time:Sat Sep 02 05:25:45 CEST 2017-1504322745000
07:25:45 CEST
jest poprawny, oczywiście.Prawidłowy czas UTC to 05:25:45 UTC
, ale ponownie jest to CEST
, co jest nieprawidłowe.
Teraz już nigdy nie będziesz potrzebować klasy Date
:-), ale jeśli kiedykolwiek miałeś zamiar, musi przeczytać All about java.util.Date na blogu kodującego Jona Skeeta.
Pytanie: Czy mogę używać 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.
Dobra odpowiedź! Jednak zamiast TimeZone.getDefault(). GetOffset (localTime.getTime()), powinny być TimeZone.getDefault(). GetOffset (gmtTime.getTimeInMillis()). W przeciwnym razie mogą wystąpić problemy z DaylightSaving, jeśli twój czas UTC jest zimą, ale czas lokalny jest w lecie. – Dime
'nowa data (ciąg znaków)' przestarzała :( –
jesteś ratownikiem T_T to jedyny sposób na rozwiązanie konfliktu java.util.date (@temporal) i znacznika czasu (postgresql) GMT vs UTC – Sarief