2012-12-28 14 views
15

Sono leap seconds soddisfatti dalla classe GregorianCalendar?I secondi bisestili sono soddisfatti dal calendario?

In caso contrario, una libreria di terze parti provvede a tale scopo?

+1

Quale applicazione del mondo reale si vede per richiedere secondi bisestili? Inoltre, non sarebbe davvero difficile tenerne conto a causa della loro rara aggiunta? – Makoto

+0

Mostra il modo di implementarlo: http://joda-time.sourceforge.net/faq.html#leapseconds – Azodious

+1

Era più curiosità, ma poteva avere implicazioni per operazioni di tempo critico come il trading. I secondi di salto sono "ufficiali", quindi potrebbero essere aggiunti ai dati del fuso orario. – Bohemian

risposta

5

java.util.Date API afferma che

" ... anche se la classe Date è intesa a riflettere Coordinated Universal Time (UTC), non può farlo esattamente, a seconda dell'ambiente host del Java Macchina virtuale ... La maggior parte degli orologi per computer non sono sufficientemente accurati per essere in grado di riflettere la distinzione del secondo. "

Wiki dice

"Perché la velocità di rotazione della Terra varia in risposta a eventi climatici e geologici, UTC salto secondi sono irregolarmente distanziati e imprevedibile. Inserimento di ogni secondo UTC salto di solito è deciso circa sei mesi di anticipo dalla Servizio internazionale di rotazione di terra e sistemi di riferimento (IERS) "

ovvero, nessuna classe può venire a conoscenza delle future decisioni IERS.

+2

Un commento javadoc IMHO che distoglie la responsabilità da una classe mal implementata. Se aggiungo un secondo prima di un secondo intercalare, il tempo dovrebbe avanzare di 2 secondi, ma non credo che lo faccia. Inoltre, l'aritmetica delle date non ha nulla a che fare con il tempo corrente. – Bohemian

+3

@Bohemian Sono d'accordo con te. E Oracle sa anche di questa scarsa implementazione, penso che sia la ragione per cui in java 8 avremo una nuova API Time/Date che supporta anche il salto di secondi (http://jcp.org/aboutJava/communityprocess/edr/jsr310/guide- 0.7.html) –

+0

Vedere il mio aggiornamento su cosa dice il wiki –

13
  1. I secondi di ritardo non sono soddisfatti da GregorianCalendar (una vista del codice sorgente di Oracle mostra questo - l'assunzione esplicita di 1 minuto = 60 secondi viene sempre fornita lì). E inoltre: Oracle ha ufficialmente negato il secondo supporto intercalare - vedi ID-bug 4272347.
  2. In Java non esiste una libreria di terze parti standard che supporti il ​​salto di secondi - nemmeno il joda-time. Solo software specializzati come this lo fanno.
  3. Si noti che molte librerie parlano di secondi bisestili sebbene non supportino, ad esempio java.util.Date (vedere risposta Dorofeevs). Anche JSR 310 parla molto, ma non supporta questa funzione. Ufficialmente JSR 310 fornisce supporto a UTC-SLS che non conta i secondi bisestili e descrive solo secondi di gomma spalancati attorno a un evento di secondo intercalare. Infatti, JSR 310 è molto confuso se supporta UNIX time o UTC-SLS (vedi punto successivo). E poiché le informazioni sul secondo intercalare (github/threeten/issues/197) sono state rimosse dal codice JSR 310, è assolutamente impossibile implementare i veri secondi UTC UTC nell'ambito di JSR 310. Nel migliore dei casi ci si potrebbe aspettare un modulo esterno in arrivo (Threeten-Extra) come supplemento per JSR 310 che darà un supporto rudimentale al meglio (è piuttosto una traduzione tra il tempo UNIX e la scala temporale TAI, non di più e usa, a mio parere, un modello di dominio fondamentalmente sbagliato).
  4. System.currentTimeMillis() si riferisce ufficialmente al timer del sistema operativo. E poiché tutto il sistema operativo che conosco, tra cui Microsoft, Linux e Apple, si basa solo sulle specifiche UNIX, questo timer di sistema java non conta secondi bisestili, solo i normali millisecondi dal 1970-01-01T00: 00: 00.000Z
  5. A causa di tutti questi fatti Ho deciso di impostare la mia libreria java data e ora, denominata Time4J, che supporta pienamente i secondi bisestili ed è disponibile come versione 1.0 con licenza LGPLv2.1. A dzone-article viene illustrato come si presenta questo supporto con la versione v4.2.
+0

+1 per la prima risposta completa. Benvenuto nello stackoverflow e buona fortuna con il tuo progetto! – Bohemian

+0

Danke! Lo sto usando nel nostro progetto ora, funziona come un incantesimo (ad esempio, riconosce correttamente che, ad esempio, '20150701_015960' era e' 20150701_025960' non lo era, una data valida in Europa/Berlino). La documentazione è davvero scarsa, però. – mirabilos

+0

@mirabilos Bitte schön, su sparse doc, sono davvero grazioso per qualsiasi tipo di suggerimento, problemi, domande, richiesta di pull per una documentazione migliore e così via. Time4J ha così tante caratteristiche che non è sempre facile mantenere il doc allo stesso livello, ma faccio del mio meglio. –

Problemi correlati