2010-10-25 15 views
13

Ho bisogno di un metodo per convertire GregorianCalendar Object in Unix Time (ad esempio un lungo). Serve anche un metodo per convertire Unix Time (long) in GregorianCalendar Object. Ci sono metodi là fuori che lo fanno? Se no, allora come posso farlo? Qualsiasi aiuto sarebbe molto apprezzato.Come posso convertire da Calendario Gregoriano a Tempo Unix, in Java?

Link a GregorianCalendar Class ->http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

Grazie.

risposta

26

I metodi getTimeInMillis() e setTimeInMillis(long) consentono di ottenere e impostare l'ora in millisecondi, che è il tempo di unix moltiplicato per 1000. È necessario regolare manualmente poiché l'ora unix non include i millisecondi - solo secondi.

 
long unixTime = gregCal.getTimeInMillis()/1000; 
gregCal.setTimeInMillis(unixTime * 1000); 

parte: se si utilizza un sacco date nell'applicazione, soprattutto se si sta convertendo date o utilizzando più fusi orari, mi raccomando utilizzando la libreria JodaTime. È molto completo e un po 'più naturale da capire rispetto al sistema Calendar fornito con Java.

+0

+1 per tempo joda –

+0

Hey, grazie. Ho solo bisogno del codice che hai scritto. Molte grazie! – androidNoob

+0

Da quando il tempo di unix non ha avuto millisecondi? – Pacerier

0

Calendar.getTimeInMillis() dovrebbe essere quello che stai cercando.

0

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 breve. Ma, FYI, le classi fastidiosi scendere Data-time come java.util.Date, java.util.Calendar e java.text.SimpleDateFormat sono ora legacy, soppiantato dalle java.time classi integrate in Java 8 & Java 9.

Così qui è come convertire e utilizzare il moderno classi invece per il tuo problema.

java.time

Converti dalla classe legacy GregorianCalendar alla classe moderna ZonedDateTime. Chiama i nuovi metodi aggiunti alle vecchie classi.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ; 

E andando nella direzione opposta ...

GregorianCalendar myGregCal = GregorianCalendar.from(zdt) ; 

Se per “Unix time” si intende un conteggio di interi secondi dal momento che la epoch reference di primo istante del 1970 in UTC, 1970-01-01T00: 00: 00Z , quindi chiama toEpochSecond.

long secondsSinceEpoch = zdt.toEpochSecond() ; 

Se si intende un conteggio di millisecondi dal 1970 ha iniziato in UTC, poi estrarre un Instant. La classe Instant rappresenta un momento nella timeline in UTC con una risoluzione di nanoseconds (fino a nove (9) cifre di una frazione decimale).

Instant instant = zdt.toInstant() ; 

Ora ask for the count of milliseconds.

long millisecondsSinceEpoch = instant.toEpochMill() ; 

Tenete a mente che chiedere sia per secondi interi o milliseconds può comportare la perdita di dati. I codici ZonedDateTime e Instant risolvono entrambi in nanosecondi. Quindi qualsiasi microseconds o nanosecondo eventualmente presente verrà ignorato mentre conti tutti i secondi o millisecondi.


Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi di data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Utilizzando un JDBC driver compatibile con JDBC 4.2 o poi, si può scambiare java.time oggetti direttamente con il database. Nessuna necessità di stringhe o classi java.sql. *.

Dove ottenere le classi java.time?

  • Java SE 8, Java SE 9, e più tardi
    • incorporato.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Molte delle funzionalità java.time è di back-porting per Java 6 .
  • Android
    • versioni successive di implementazioni fascio Android delle classi java.time.
    • Per Android precedente, il progetto ThreeTenABP si adatta a ThreeTen-Backport (menzionato sopra). Vedi How to use ThreeTenABP….

Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.

Problemi correlati