2009-03-18 11 views
7

Estoy familiarizado con las clases de fecha y hora en el JDK y sus métodos de formateo asociados. Puedo ser ciego, pero no puedo encontrar un conjunto equivalente de clases para procesar los intervalos de tiempo. Por ejemplo, me gustaría mostrar el número de días para un valor largo dado de milisegundos. Me doy cuenta de que el método para hacer estas conversiones es bastante simple, sin embargo, cuando se tiene en cuenta la internacionalización y el soporte de localización, esto se vuelve menos trivial.¿Existe alguna manera fácil de calcular y formatear los intervalos de hora/fecha en Java?

Me sorprende que al JDK le falte soporte para el procesamiento por intervalos. Sin embargo, las bases de datos como Postgresql lo admiten.

Básicamente lo que estoy buscando en el JDK (si estoy demasiado ciego para verlo) o en una biblioteca de terceros es el siguiente funcionalidad:

  • métodos de cálculo de tiempo. Tales como milisegundos a semanas o segundos a nanosegundos. Aunque la matemática es simple para estas operaciones, tener una API para atravesar me parece más autodocumentado.
  • Funciones de formato de intervalo de tiempo que formatean de acuerdo con la configuración regional pasada como funciona el formato de fecha. Por ejemplo, en EN_US supondría que 10 días son buenos "10 días" y en japonés me gustaría que se devuelva "10 日".

¿Hay algo por el estilo o es un canidate para un nuevo proyecto de código abierto?

Respuesta

9

¿Ha intentado Joda Time?

+0

+1 Joda Time se ve bastante impresionante. Tiene un procesamiento de intervalo además de un buen soporte de calendario localizado. – Elijah

+1

Esto se está convirtiendo en casi un cliché. (Consulte los comentarios en http://stackoverflow.com/questions/635935/how-can-i-calculate-a-time-span-in-java-and-format-the-output y http://stackoverflow.com/questions/643402/simple-java-date-calculations, y probablemente todas las preguntas en la sección "relacionada".) –

+0

Quizás esto debería decirles a los desarrolladores de Java algo acerca de una omisión obvia en el jdk. Oye, ¿escucharon? – Elijah

3

echar un vistazo a http://commons.apache.org/ y la clase DateUtils no

+0

¿En qué proyecto se encuentra esa clase? – Elijah

+0

+1 Entendido. Está en el paquete lang. Es bueno saber que está allí porque ya estoy importando Lang en mi proyecto actual. – Elijah

0

Lamentablemente, no hay nada como esto en la Biblioteca estándar, pero como señala Tobiask, los Apache Commons tienen una herramienta útil para esto.

DurationFormatUtils tiene algunos formatos predefinidos (Hora: Minutos: Segundo, ISO) y le permite especificar los suyos propios.

1

tl; dr

Duration.ofMillis(yourMillisecondsLongNumberGoesHere) 
     .toDays() 

Usando java.time

Las clases de fecha y hora viejas problemáticas han sido suplantada por las clases java.time.

me gustaría visualizar el número de días para un valor de tiempo determinado de milisegundos

por una duración de tiempo que implica horas, minutos y segundos (y día definidos como trozos de 24 horas), use la clase Duration.

Duration d = Duration.ofMillis(yourMillisecondsLongNumberGoesHere); 

para obtener el número de días, que se define mediante la definición del número total de segundos enteros por 86,400L, llame toDays.

long days = d.toDays(); 

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 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.

¿Dónde obtener las clases java.time?

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