2010-10-25 17 views
13

Necesito un método para convertir el objeto GregorianCalendar a tiempo Unix (es decir, un largo). También necesita un método para convertir Unix Time (long) en GregorianCalendar Object. ¿Hay algún método que haga esto? Si no, ¿cómo puedo hacerlo? Cualquier ayuda sería muy apreciada.¿Cómo puedo convertir el Calendario Gregoriano al Tiempo Unix, en Java?

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

Gracias.

Respuesta

26

Los métodos getTimeInMillis() y setTimeInMillis(long) le permitirá obtener y establecer el tiempo en milisegundos, que es el tiempo Unix multiplicado por 1000. Usted tendrá que ajustar manualmente desde el tiempo UNIX no incluye milisegundos - a sólo unos segundos.

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

Aparte: si utiliza fechas mucho en su aplicación, sobre todo si va a convertir las fechas o el uso de múltiples zonas horarias, Yo recomendaría el uso de la biblioteca JodaTime. Es muy completo y bastante más natural de entender que el sistema Calendar que viene con Java.

+0

+1 por tiempo joda –

+0

Hola gracias. Solo necesitaba el código que escribiste. ¡Muchas gracias! – androidNoob

+0

¿Desde cuándo el tiempo de Unix no tiene milisegundos? – Pacerier

0

Calendar.getTimeInMillis() debe ser lo que estás buscando.

0

tl; dr

myGregCal.toZonedDateTime().toEpochSecond()      // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`. 

Y va la otra dirección ...

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") 
     ) 
)                

Evitar el legado clases de fecha y hora

Las otras respuestas son correctas y corto. Pero, para tu información, las clases de fecha y hora viejas problemáticas tales como java.util.Date, java.util.Calendar y java.text.SimpleDateFormat son ahora legacy, suplantados por los java.time clases integradas en Java 8 & Java 9.

Así que aquí es cómo convertir y utilizar la moderna clases en su lugar para su problema.

java.time

Convertir de la clase legado GregorianCalendar a la clase moderna ZonedDateTime. Llame a nuevos métodos agregados a las clases antiguas.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ; 

Y va la otra dirección ...

GregorianCalendar myGregCal = GregorianCalendar.from(zdt) ; 

Si por “Unix time” que significaba un recuento de segundos enteros desde el epoch reference del primer momento de 1970 en UTC, 1970-01-01T00: 00: 00Z , luego llama al toEpochSecond.

long secondsSinceEpoch = zdt.toEpochSecond() ; 

Si usted significó un recuento de milisegundos desde el año 1970 se inició en UTC, a continuación, extraer un Instant. La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).

Instant instant = zdt.toInstant() ; 

Ahora ask for the count of milliseconds.

long millisecondsSinceEpoch = instant.toEpochMill() ; 

Tenga en cuenta que el pedir, ya sea enteros o segundo milliseconds puede implicar la pérdida de datos. El ZonedDateTime y el Instant ambos resuelven en nanosegundos. Por lo tanto, cualquier microseconds o nanosegundos que puedan estar presentes se ignorarán a medida que cuente sus segundos o milisegundos completos.


Sobre java.time

El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora de legacy, como java.util.Date, Calendar, & SimpleDateFormat.

El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.

Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

El uso de un JDBC driver compatible con JDBC 4.2 o temprano, es posible intercambiar java.time objetos directamente con su base de datos. No necesita cadenas ni clases java.sql. *.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y más tarde
    • incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter y more.

Cuestiones relacionadas