2012-12-28 11 views
15

Czy leap seconds pokrywane przez klasy GregorianCalendar?Czy sekund przestępnych pokrywane przez Kalendarz?

Jeśli nie, czy biblioteka innych firm obsługuje to?

+1

Jakiej aplikacji w realnym świecie potrzebujesz, aby wymagać sekund przestępnych? Ponadto, czy nie byłoby naprawdę trudno je uwzględnić z powodu ich rzadkiego dodawania? – Makoto

+0

Wskazuje sposób wdrożenia: http://joda-time.sourceforge.net/faq.html#leapseconds – Azodious

+1

To była ciekawostka, ale może mieć wpływ na operacje o znaczeniu krytycznym dla czasu, takie jak handel. Sekundowe sekundy są "oficjalne", więc można je dodać do danych strefy czasowej. – Bohemian

Odpowiedz

5

java.util.Date API mówi, że

”... chociaż klasa Date ma odzwierciedlać uniwersalnym czasem koordynowanym (UTC), może nie tak dokładnie, w zależności od środowiska hosta Java Maszyna wirtualna ... Większość zegarów komputerowych nie jest wystarczająco dokładna, aby odzwierciedlać rozróżnienie sekund przestępnych. "

Wiki mówi

„Ponieważ prędkość obrotowa Ziemi zmienia się w odpowiedzi na zdarzenia klimatyczne i geologiczne, UTC sekundy przestępne są nieregularnie rozmieszczone i nieprzewidywalne. Wstawienie każdej sekundzie UTC przestępnym jest zwykle zdecydował o sześć miesięcy wcześniej przez Międzynarodowa Służba Obrotu Ziemi i Systemów Referencyjnych (IERS) "

to znaczy, żadna klasa nie może wiedzieć o przyszłych decyzjach IERS.

+2

Komentarz do javadoc IMHO, który odwraca odpowiedzialność od źle zaimplementowanej klasy. Jeśli dodaję sekundę tuż przed sekundą, czas powinien wynieść 2 sekundy, ale nie sądzę, żeby tak było. Poza tym arytmetyczna data nie ma nic wspólnego z bieżącym czasem. – Bohemian

+3

@Bohemian Zgadzam się z tobą w pełni. A Oracle wie również o tej słabej implementacji, myślę, że właśnie dlatego w java 8 będziemy mieli nowy interfejs API Time/Date, który obsługuje również sekundy przestępne (http://jcp.org/aboutJava/communityprocess/edr/jsr310/guide- 0.7.html) –

+0

Zobacz moją aktualizację na temat tego, co wiki mówi –

13
  1. dodatkowe sekundy nie są pokrywane przez kalendarz gregoriański (widok z kodu źródłowego w Oracle pokazuje ten - wyraźne założenie 1 minuta = 60 sekund, jest zawsze tam podane). Co więcej: Oracle oficjalnie zaprzeczył drugiemu krokowi wsparcia - patrz Bug-ID 4272347.
  2. W Javie nie ma standardowej biblioteki stron trzecich, która obsługuje sekundy przestępne - nawet w przypadku joda. Działa tylko wyspecjalizowane oprogramowanie, takie jak this.
  3. Należy pamiętać, że wiele bibliotek mówi o sekundach przestępnych, chociaż nie obsługuje, na przykład java.util.Date (patrz odpowiedź Dorofeevs). Również JSR 310 dużo mówi, ale nie obsługuje tej funkcji. Oficjalnie JSR 310 zapewnia wsparcie dla UTC-SLS, który nie liczy sekund przestępnych i opisuje tylko zatarcia gumowych sekund wokół sekundowego zdarzenia typu "skok". Rzeczywiście JSR 310 jest bardzo mylące jeśli obsługuje czas UNIX lub UTC-SLS (patrz następny punkt). A ponieważ druga informacja (github/threeten/issues/197) została usunięta z bazy kodu JSR 310, absolutnie niemożliwe jest zaimplementowanie prawdziwych sekundowych skoków UTC w zakresie JSR 310. W najlepszym przypadku można spodziewać się modułu zewnętrznego (Threeten-Extra) jako dodatku do JSR 310, która da w najlepszym wypadku szczątkowe wsparcie (jest to raczej tłumaczenie pomiędzy czasem UNIX a skalą czasu TAI, a nie więcej i wykorzystuje, moim zdaniem, całkowicie niewłaściwy model domeny).
  4. System.currentTimeMillis() oficjalnie odnosi się do zegara systemu operacyjnego. A ponieważ wszystko, co znam, w tym Microsoft, Linux i Apple są oparte tylko na specyfikacji UNIX, ten zegar systemu java nie liczy sekund przestępnych, tylko normalna milisekunda od 1970-01-01T00: 00: 00.000Z
  5. Z powodu tych wszystkich fakty Zdecydowałem się ustawić własną datę i godzinę biblioteki Java o nazwie Time4J, która w pełni obsługuje sekundy przestępne i jest dostępna jako wersja 1.0 z licencją LGPLv2.1. A dzone-article pokazuje, jak to wsparcie wygląda w wersji v4.2.
+0

+1 za dokładną pierwszą odpowiedź. Witamy w stackoverflow i powodzenia w projekcie! – Bohemian

+0

Danke! Używam tego w naszym projekcie teraz, działa jak zaklęcie (tj. Poprawnie rozpoznaje, że na przykład "20150701_015960" było i "20150701_025960" nie było, prawidłowa data w Europie/Berlinie). Dokumentacja jest jednak naprawdę skąpa. – mirabilos

+0

@mirabilos Bitte schön, o rzadkim doc, jestem naprawdę wdzięczny za wszelkie sugestie, problemy, pytania, prośba o pociągnięcie za lepszą dokumentację i tak dalej. Time4J ma tak wiele funkcji, że nie zawsze jest łatwo utrzymać dokument na tym samym poziomie, ale staram się jak najlepiej. –

Powiązane problemy