2012-05-07 25 views
9

Dokumentacja Date.getTimezoneOffset mówi:Dlaczego Date.getTimezoneOffset przestał być przestarzały?

przestarzała. Począwszy od wersji JDK 1.1, zastąpionej przez - (Calendar.get (Calendar.ZONE_OFFSET) + Calendar.get (Calendar.DST_OFFSET))/(60 * 1000).

Dlaczego był przestarzały? Czy istnieje krótsza droga (Apache Commons?), Aby uzyskać przesunięcie z UTC w godzinach/minutach? Mam obiekt Date ... powinienem go przekonwertować na JodaDate?

Zanim zapytasz, dlaczego chcę przesunąć UTC - wystarczy, że zalogujesz się, nic więcej.

+2

Powinieneś przełączyć się do JodaTime na wszystko, co wiąże się z obsługą Daty i Czasu w Java IMHO. – pcalcao

+4

Ponieważ nie każde przesunięcie strefy czasowej jest liczbą całkowitą. Innymi słowy, nie każda strefa czasowa jest o godzinę wcześniej lub później niż przyległa strefa czasowa. Sprawdź http://www.timeanddate.com/worldclock/ –

+2

@GilbertLeBlanc - zwraca minuty, a nie godziny. – ripper234

Odpowiedz

10

Tutaj są 2 pytania.

  1. Dlaczego Date.getTimezoneOffset przestał być przestarzały?

Myślę, że to dlatego, że faktycznie wycofali prawie wszystkie metody Date i przenieśli swoją logikę do kalendarza. Oczekujemy, że użyjemy generic set i get z parametrem, który mówi, jakiego konkretnego pola potrzebujemy. To podejście ma pewne zalety: mniejszą liczbę metod i możliwość uruchamiania setterów w pętli przechodzącej przez inne pole za każdym razem. Ja osobiście użyłem tej techniki: sprawia, że ​​kod jest krótszy i łatwiejszy w utrzymaniu.

  1. Skrót? Ale co jest złego w zaproszeniu

Calendar.get(Calendar.DST_OFFSET) porównaniu do Calendar.getTimeZoneOffset()

O ile widzę różnica wynosi 6 znaków.

Joda jest bardzo silną biblioteką i jeśli naprawdę trzeba napisać dużo wyrafinowanego kodu manipulowania datą, należy ją zmienić. Osobiście używam standardu java.util.Calendar i nie widzę powodu, aby korzystać z zewnętrznych bibliotek: dobry stary kalendarz jest wystarczająco dobry dla mnie.

+1

+1 za polecenie Jody. –

+0

Zaakceptuję to dla 'oni faktycznie przestarzali wszystkie metody Daty'. Wszyscy polecam przełączyć się na joda - chill proszę, jest to obiekt daty w API, którego używam, nie mogę teraz zmienić interfejsu API, czy mogę. – ripper234

3

Po wprowadzeniu implementacji Javy w implementację Java okazało się, że może zaistnieć potrzeba implementacji różnych typów różnych kalendarzy (stąd potrzeba użycia numeru GregorianCalendar, aby pobrać te informacje teraz). A Date jest teraz tylko opakowaniem wokół wartości czasu UTC.

2

Należy zachować ostrożność przed wklejeniem kodu z tej strony. Może tylko ja, ale wierzę, że w celu uzyskania tz przesunięcie w minutach trzeba zrobić

int tzOffsetMin = (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET))/(1000*60); 

raczej niż to, co mówi Javadoc, czyli:

int tzOffsetMin = -(cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET))/(1000*60); 



Calendar.ZONE_OFFSET daje standardowe przesunięcie (w msecs) z UTC. Nie zmienia się to z DST. Na przykład w strefie czasowej US wschodniego wybrzeża to pole zawsze będzie wynosić -6 godzin, niezależnie od czasu letniego.

Calendar.DST_OFFSET podaje aktualne przesunięcie czasu letniego (w msecs) - jeśli występuje.Na przykład latem w kraju, który używa DST, pole to może mieć wartość +1 godzinę (1000 * 60 * 60 msek).