venerdì 22 luglio 2011

Groovy, Java, e il tempo di Unix Epoch

Inserito da Dustin Marx

Fine modulo

Il legame che ogni programmatore dovrebbe conoscere circa Tempoè stato recentemente pubblicato su DZone ed è stato un legame molto popolare. Si fa riferimento alla originale Emil Mikulic messaggio Ora e cosa programmatori dovrebbero sapere . Questo post e la sua popolarità era ricordo a me di quanto spesso mi trovo a che fare con date e ore nello sviluppo di software e in particolare durante la scrittura di script. Mi piacciono molte delle raccomandazioni Mikulic, perché sento che le convenzioni e le norme possono mantenere la complessità del lavoro con fusi orari ,ora legale , e secondo salto / anni bisestili in qualche modo gestibile.

Ho più volte apprezzato il fatto che Java (e per estensione, Groovy) Tempo di base contro la stessa epoca , come Unix. Java e Unix sia mezzanotte uso, 1 Gennaio, 1970 UTC / GMT epoca come il loro tempo. La documentazione Javadoc per entrambi Java standard "Data" classi ( java.sql.Date e java.util.Date ) parlare del significato di tale data. Il java.sql.Date stati documentazione, "Un valore millisecondi rappresenta il numero di millisecondi trascorsi dalla 1 Gen 1970 00:00:00.000 GMT", mentre java.util.Datedocumentazione sul costruttore dichiara l'accettazione di un lungo "Assegna una data oggetto e lo inizializza a rappresentare il numero specificato di millisecondi dal momento in base tipo conosciuto come "l'epoca", cioè 1 gennaio 1970, 00:00:00 GMT. " Il java.util.Datedocumentazione va anche in una discussione le sottili differenze tra GMT / UTC / UT.

Poiché Java (e Groovy) basano la loro data / ora API ( Data , Data e calendario ) al largo del tempo stessa epoca a partire Unix, è più facile trattare con date e gli orari durante la scrittura di script Groovy in ambiente Linux. La cosa più importante da tenere a mente per la conversione tra i due è che Unix API tendono ad usare secondi dai tempi dell'epoca, mentre le API di Java tendono ad usare milli secondi da allora stessa epoca. In breve, la conversione tipico è quello di moltiplicare Unix secondi dal periodo dal 1000 per ottenere Java millisecondi dal momento epoca o dividere Java millisecondi dal periodo per 1000 per ottenere Unix secondi dal periodo.

Io ora mostrare un paio di semplici esempi. E 'facile ottenere un esempio Unix. L'istantanea schermata successiva mostra il numero di secondi dal tempo di Unix epoca per l'ultima volta che la pagina è stata aggiornata.


Come l'immagine qui sopra indica, il numero intero 1310724379 rappresenta "2011/07/15 10:06:19 Z"
Ciò è dimostrato anche con la linea Converter epoca , come mostrato nello snapshot schermata successiva.


E 'davvero facile da calcolare il tempo stesso in Groovy da quello intero.
Questo è mostrato nella schermata successiva l'istantanea.


Il codice per il sopra era così semplice che ho potuto invocare semplicemente tramite la riga di comando
lanciatore Groovycon l' opzione-e . Il codice inline Groovy è stato abbastanza semplice ed è mostrato di nuovo qui:

println new Date ((1310724379 purché) * 1000) Ci sono state alcune cose minori che doveva essere fatto per convertire il numero utilizzato per i secondi Unix dal periodo di Java / Groovy 's millisecondi dal epoca. In primo luogo, c'è stata la ovvia necessità di moltiplicare il numero Unix per 1000 per ottenere da secondi a millisecondi. La coercizione Groovy ad una lunga è necessario anche in modo che la cifra non è trattato come un int, che conduce al momento sbagliato. L'effetto di questo è mostrato nella schermata successiva snapshot in cui viene mostrato il numerale da sé che conduce al momento sbagliato e con il più tradizionale approccio Java di costringere il numerale a lungo con la "L designazione. Come indica l'immagine, la coercizione a una lunga è di vitale importanza per eseguire la conversione corretta.

L'esempio mostra il tempo Groovy MST piuttosto GMT. Ci sono modi per affrontare questo in Java come l'utilizzoDateFormat.setTimeZone (fuso orario) o Calendar.setTimeZone (fuso orario) . Si può utilizzare uno di questi approcci per ottenere un UTC / GMT rappresentazione del tempo.

In fase di sviluppo Java o Groovy, è facile salvare date e orari nel database come tale, ma può anche essere efficace per memorizzare semplicemente il numero intero che rappresenta il tempo trascorso epoca nel database. Quando questo approccio, la mia preferenza è quella di immagazzinare sempre UTC / GMT volte. Questo evita la necessità di memorizzare un offset per avere l'ora esatta a meno che l'offset è desiderato per visualizzare l'ora di un fuso orario locale. Comprendere la Unix Epoch (in Java), fusi orari e ora UTC è un buon posto sulla gestione di Java di date / volte in formato UTC. Che fa riferimento dopo il post di tempo corrente e System.currentTimeMillis () come una buona fonte di informazioni sulla data / ora di stoccaggio lavora in Java. Making Sense of Date di Java è un'altra buona fonte di informazioni su Java e le date.

E 'facile determinare quali Java e Groovy usare come il loro tempo epoca senza andare alla documentazione. Il seguente script Groovy fa proprio questo.

displayZeroEpochTime.groovy
! # / usr / bin / env groove

def zeroEpoch = Calendar.getInstance (TimeZone.getTimeZone ('CET'))

zeroEpoch.setTimeInMillis (0)

zeroEpoch.format println ("dd-MMM-aaaa hh: mm: ss zzz ")
L'uscita di esso è mostrato nella schermata successiva snapshot e verifica che 0 millisecondi dal momento in epoca significa 1 Gennaio 1970, 00:00:00 GMT.


Se Java / Groovy e Unix erano tempi diversi d'epoca, si potrebbe calcolare la differenza tra i loro punti di partenza e continuamente applicare tale differenza di conversione tra i due sistemi.
Tuttavia, utilizzando al tempo stesso epoca come Unix, Java creatori originali hanno reso più facile per noi scrivere script Groovy che si occupano di tempo per integrarsi con le funzioni di tempo di gestione Unix. Questo fa sicuramente di scripting in ambiente Linux più facile.

Corso Java - Corsi Java - Corsi programmazione Java

Corso programmazione Android - Certificazione Android


Nessun commento:

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.