Come posso convertire da Calendario Gregoriano al Tempo Unix, in Java?
-
26-09-2019 - |
Domanda
Ho bisogno di un metodo per convertire GregorianCalendar oggetto per ora Unix (vale a dire un lungo). Anche bisogno di un metodo per convertire Unix Time (lungo) di nuovo a GregorianCalendar oggetto. Ci sono metodi là fuori che fa questo? Se no, allora come posso farlo? Qualsiasi aiuto sarebbe molto apprezzato.
Link a GregorianCalendar Class -> http : //download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html
Grazie.
Soluzione
I metodi getTimeInMillis()
e setTimeInMillis(long)
vi permetterà di ottenere e impostare il tempo in millisecondi, che è il tempo unix moltiplicato per 1000. Si dovrà regolare manualmente da tempo unix non include millisecondi -. Solo pochi secondi
long unixTime = gregCal.getTimeInMillis() / 1000; gregCal.setTimeInMillis(unixTime * 1000);
A parte : se si utilizza un sacco date nell'applicazione, soprattutto se si sta convertendo date o utilizzando più fusi orari, mi raccomando utilizzando il biblioteca JodaTime . E 'molto completo e un po' più naturale da capire che il sistema di calendario che viene fornito con Java.
Altri suggerimenti
Credo che GregorianCalendar .getTimeInMillis () e GregorianCalendar.SetTimeInMillis () vi permetterà di ottenere e impostare lungo i valori nel modo desiderato.
Controlla le setTimeInMillis e getTimeInMillis funzioni: http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis ()
Calendar.getTimeInMillis () dovrebbe essere quello che stai cercando.
tl; dr
myGregCal.toZonedDateTime().toEpochSecond() // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`.
E andando nella direzione opposta ...
GregorianCalendar.from( // Convert from modern `ZonedDateTime` to troublesome legacy class `GregorianCalendar`.
Instant.ofEpochSecond( yourCountOfWholeSecondsSinceEpoch ) // Moment in UTC.
.atZone( // Apply `ZoneId` to `Instant` to produce a `ZonedDateTime` object.
ZoneId.of( "Africa/Tunis" )
)
)
Evitare legacy classi data-ora
Le altre risposte sono corrette e di breve. Ma, FYI, le classi data-ora vecchi problematici, come java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
sono ora eredità , soppiantato dal java.time classi integrato in Java 8 & 9. Java
Quindi, ecco come convertire e utilizzare le classi moderne, invece, per il vostro problema.
java.time
Converti dal GregorianCalendar
classe di eredità al moderno ZonedDateTime
di classe. Chiamare nuovi metodi aggiunti alle vecchie classi.
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
E andando nella direzione opposta ...
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
Se da “tempo Unix” si intende un conteggio di interi secondi dal momento che la di riferimento dell'epoca di primo istante del 1970 in UTC, 1970-01-01T00: 00: 00Z , quindi chiamare toEpochSecond
.
long secondsSinceEpoch = zdt.toEpochSecond() ;
Se si intende un conteggio di millisecondi dal 1970 iniziato in UTC, poi estrarre un Instant
. Il Instant
classe rappresenta un momento sulla timeline in UTC con una risoluzione di nanosecondi (fino a nove (9) cifre di una frazione decimale).
Instant instant = zdt.toInstant() ;
chiedere il conteggio di millisecondi .
long millisecondsSinceEpoch = instant.toEpochMill() ;
Tieni presente che chiedere sia per interi secondi o millisecondi può comportare la perdita di dati. Il ZonedDateTime
e Instant
sia volontà di nanosecondi. Quindi, qualsiasi microsecondi o nanosecondi che possono essere presenti verrà ignorato come si conta tutta la vostra secondi o millisecondi .
A proposito di java.time
Il java.time quadro è costruito in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidioso legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Il Joda Time progetto , ora in < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "nofollow noreferrer"> modalità manutenzione , consigliati migrazione al java.time classi .
Per ulteriori informazioni, vedere la Oracle Esercitazione . E cercare Stack Overflow per molti esempi e spiegazioni. Le specifiche sono JSR 310 .
Utilizzando un driver JDBC compatibile con JDBC 4.2 o poi, si può scambiare java.time oggetti direttamente con il database. Non c'è bisogno di corde né java.sql. * Classi.
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
- Le versioni successive di Android fascio implementazioni delle classi java.time.
- Per precedenza Android, il ThreeTenABP adatta progetto ThreeTen-Backport (di cui sopra). Vedere Come utilizzare ThreeTenABP ... .
Il ThreeTen-Extra progetto estende java.time con classi aggiuntive. Questo progetto è un banco di prova per eventuali future integrazioni java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
, e informazioni .