Raggruppamento lungo UTC risale by Day
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?
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?
- Java SE 8 , Java SE 9 , e più tardi
- Built-in.
- Parte delle API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità minori e correzioni.
- Java SE 6 e Java SE 7
- La maggior parte delle funzionalità java.time è di back-porting per Java 6 & 7 a ThreeTen-Backport .
- Android
- Il ThreeTenABP progetto adatta < em> ThreeTen-Backport (di cui sopra) per Android in particolare.
- Come utilizzare ThreeTenABP ... .
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 .