Domanda

C'è un modo ragionevole per lunghe del gruppo UTC risale by Day?

Io li mod da 86400, ma che non tiene secondo salto in considerazione.

Qualcuno ha altre idee, sto usando Java così ho potuto analizzare in Data Objects, ma io sono un po 'preoccupato del sovraccarico delle prestazioni di utilizzare la classe data.

Inoltre è ci un modo più efficiente di confronto tra il mese e il giorno parti anno di un oggetto Date?

È stato utile?

Soluzione

Il tuo dati di origine sicuramente comprendono salto secondi per iniziare? Alcune API fanno, e alcuni non lo fanno - Joda Time (che vi consiglio sopra la data / ora built-in API) non usa salto secondi , per esempio. La data e ora API Java "a volte" fanno - sostengono 60 e 61 come valori di "secondo in minuto" ma il supporto dipende dal sistema operativo (vedi sotto). Se si dispone di alcuni buoni valori di esempio, mi piacerebbe controllare che prima, se fossi in te. Ovviamente solo dividendo è piuttosto semplice rispetto a qualsiasi altra cosa.

Se do necessario creare Date oggetti (o DateTime in Joda) lo farei riferimento prima di fare qualsiasi altra cosa. Si può anche trovare che la performance è in realtà perfettamente adeguata. Non ha senso sprecare tempo a ottimizzare qualcosa che è bene per i vostri dati. Naturalmente, è necessario decidere la dimensione dei dati è necessario supportare, e come rapido ha bisogno di essere prima:)

Anche il supporto per java.util.Date secondo salto è un po 'indeterminata. Da la documentazione :

  

Anche se la classe Date ha lo scopo di   riflettere Coordinated Universal Time   (UTC), non può farlo esattamente,   a seconda dell'ambiente serie di   Java Virtual Machine. Quasi tutte   i moderni sistemi operativi presumono che 1   giorno = 24 × 60 × 60 = 86400 secondi   tutti i casi. In UTC, tuttavia, circa una volta   ogni anno o due c'è un extra   secondo, chiamato "secondo intercalare". Il   secondo intercalare viene sempre aggiunto come   ultimo secondo della giornata, e sempre in   31 dicembre o il 30 giugno, ad esempio,   all'ultimo minuto dell'anno 1995 è stato   61 secondi lunghi, grazie ad un aggiunto   secondo intercalare. La maggior parte degli orologi dei computer sono   non sufficientemente accurata per essere in grado di   riflettere il salto-seconda distinzione.

C'è un piuttosto buona post sul blog per il disordine con Java e secondo salto, che si consiglia di leggere anche.

Altri suggerimenti

  

Io li mod da 86400, ma che non tiene in considerazione secondo salto ....

Sono abbastanza sicuro che che andrà bene. La documentazione API per Date in realtà non dovrebbe includere nulla di secondo salto, perché il fatto è che emula un tempo ticker standard di Unix che non include secondo salto nel suo valore. Ciò che fa invece è quello di avere un secondo 59 ° che dura per due secondi impostando il valore ticker indietro di 1 secondo all'inizio di un secondo intercalare (come il link nel post precedente descrive).

Quindi si può supporre che il valore si ottiene da Date.getTime() si compone solo di 86400 secondi giorni. Se avete veramente bisogno di sapere se un particolare al giorno ha avuto un secondo salto, ci sono diversi tavoli disponibili su Internet (ci sono stati solo 23-24 dal 1972, e le date computer prima che raramente li ha preso in conto in ogni caso).

HIH

Winston

tl; dr

Instant.ofEpochSecond( 1_493_367_302L )            // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
       .atZone( ZoneId.of( "Pacific/Auckland" ) )  // Adjust into the time zone as a context for determining a date.
       .toLocalDate()                              // Extract a date-only value by which we can sort/collect/organize our date-time values.

Fuso orario

Il java.util.Date classe rappresenta un momento sulla timeline in UTC. Quindi chiedere per una data che si ottiene una data che ha senso solo in UTC. Quello stesso momento può essere una data anteriore in Québec o una data successiva a Auckland, Nuova Zelanda.

Fuso orario è cruciale nel determinare la data, e la vostra domanda ignora questo problema.

Uso java.time

Il 1970-01-01T00:00:00 classe è parte delle classi fastidiosi scendere Data in tempo che ora sono l'eredità, soppiantato dalle classi java.time.

Per quanto riguarda il secondo salto, come le altre risposte suggerite, la maggior parte delle fonti d'epoca count-da-do non conteggio salto secondi. Così verificare la tua fonte.

Se si dispone di un conteggio di interi secondi da epoca di Instant, quindi utilizzare il metodo statico per creare un oggetto continent/region.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
  

instant.toString (): 2017-04-28T08: 15: 02Z

Assegna un fuso orario per creare il contesto in cui siamo in grado di determinare una data. Per ogni dato momento, la data varia in tutto il mondo a seconda della zona.

corretta oraria Nome nel formato America/Montreal, come ad esempio < a href = "https://en.wikipedia.org/wiki/America/Montreal" rel = "nofollow noreferrer"> Africa/Casablanca , Pacific/Auckland o EST. Non usare mai il 3-4 lettera sigla come IST o ZonedDateDate come sono non fusi orari veri e propri, non standardizzati, e nemmeno unici (!).

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime zdt = instant.atZone( z );
  

zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [America / Los_Angeles]

Con del mazzo di questi LocalDate oggetti, è possibile confrontare in base alla data. È possibile estrarre un Map oggetto. Il List classe rappresenta una data valore -solo senza tempo del giorno e senza fuso orario.

LocalDate ld = zdt.toLocalDate();
  

ld.toString (): 2017/4/28

Quindi, si potrebbe fare un Set con ZonedDateTime come chiave e un Calendar o SimpleDateFormat di Interval oggetti come il valore. E con la moderna sintassi lambda, è possibile utilizzare flussi di fare che la mappatura.


A proposito di java.time

Il java.time quadro è integrato in Java 8 e versioni successive. Queste classi soppiantare la fastidiosi come YearWeek , YearQuarter , e <=> .

Il Joda Time progetto, ora in modalità manutenzione , consiglia migrazione al classi java.time .

Per ulteriori informazioni, vedere la Oracle Tutorial . E cercare Stack Overflow per molti esempi e spiegazioni. Le specifiche sono JSR 310 .

Dove ottenere le classi java.time?

Il ThreeTen-Extra progetto estende java.time con classi aggiuntive. Questo progetto è un banco di prova per eventuali aggiunte future java.time. Si possono trovare alcune classi utili, come per esempio <=> , <=> , <=> , e informazioni .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top