2012-06-20 11 views
5

Estoy tratando de implementar Joda-Time para contar hacia abajo en Navidad, pero hasta ahora estoy en huelga. Intenté java.util.Date y la mayoría de las preguntas y respuestas de StackOverflow sugirieron usar Joda-Time. Pero no puedo hacer que funcione. Algunos códigos dan respuestas diferentes.Cuenta atrás para Navidad con Joda-Time

Éstos son algunos códigos que probé,

DateTime now = new DateTime(); 
DateTime christmas = new DateTime(2012, 12, 25, 8, 0, 0, 0); 
Days daysToChristmas = Days.daysBetween(today, christmas); 
System.out.println(daysToChristmas.toString()); 

Y esto imprime P187D como respuesta.

DateTime start = new DateTime(DateTime.now()); 
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0); 
Interval interval = new Interval(start, end); 
Period period = interval.toPeriod(); 
System.out.println("Seconds " + period.getSeconds()); 
System.out.println("Minutes " + period.getMinutes()); 
System.out.println("Hours " + period.getHours()); 
System.out.println("Days " + period.getDays()); 

Y este resultado impresiones siguientes,

Seconds 36 
Minutes 21 
Hours 7 
Days 4 

que hice mal?

+0

¿Qué pasa con el primer código? –

+0

Imprime P187D. ¿Cómo obtengo Días, horas, minutos y segundos de ese objeto? –

Respuesta

11

Debe utilizar un Period con el fin de determinar el número de meses/días/etc involucrados:

Period period = new Period(start, end); 

La conversión de una Interval a un período habría estado bien también, pero la sobrecarga sin parámetros incluye todo unidades de período, y no estaba imprimiendo los meses.

Ahora, si solo quiere días, horas, minutos, segundos, entonces necesita crear un PeriodType apropiado, p. Ej.

PeriodType periodType = PeriodType.dayTime().withMillisRemoved(); 
Period period = new Period(start, end, periodType); 

Luego puede solicitar esos campos individuales, y todo debería estar bien.

(En realidad se podría utilizar simplemente dayTime(), dado que los millis no interferirán con cualquier otra cosa.)

por lo que puede construir su periodo directamente desde el start y end que el anterior, o si desea mantener el Interval, puede utilizar:

Period period = interval.toPeriod(periodType); 
+0

No puedo creer que te estoy diciendo esto de todas las personas, pero ... Creo que eres incorrecta sobre esa primera oración. La clase ['Interval'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html) sí comprende los objetos DateTime iniciales y finales. Sospecho que confundiste a Interval con la clase ['Duration'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Duration.html). En Joda-Time, una duración es un período de tiempo en milisegundos, sin una posición en la línea de tiempo. El uso de Intervalo del código de ejemplo de la Pregunta es correcto, si es innecesario. –

+0

@BasilBourque: Definitivamente tienes razón de que me confundía con la duración. 'Interval' es, en mi opinión, * lógicamente * el tipo incorrecto, ya que está documentado como el tiempo entre dos * instantes *, lo que significa que no debe haber cronología involucrada; sin embargo,' Interval' también almacena 'Chronology', por lo que puede de hecho, recupera los puntos finales apropiados como valores 'DateTime'. Creo que probablemente sea mejor simplemente limpiar el primer par de frases, lo que haré ahora :) –

+0

@BasilBourque: Al final decidí reestructurar las cosas un poco más. ¡Muchas gracias por la corrección! –

2

El primer código imprime P187D, en formato ISO 8601.

El segundo código imprime solo 4 días porque le faltan los meses (period.getMonths()).

+0

Bueno, hay una manera de convertir meses a fechas, no necesito meses, solo necesito días. –

+0

@ La respuesta de Jon Skeet ya explica cómo hacerlo. – tibtof

2

puede utilizar este código.

DateTime dt1 = new DateTime(); 
DateTime dt2 = new DateTime(2012, 12, 25, 0, 0, 0, 0); 
int seconds=Seconds.secondsBetween(dt1, dt2).getSeconds(); 

int noOfDays=seconds/(24*60*60); 
int noOfHours=(seconds%(24*60*60))/(60*60); 
int noOfMinutes=((seconds%(24*60*60))%(60*60))/60; 
int noSec=((seconds%(24*60*60))%(60*60))%60; 

System.out.println("Time Left For christmas"); 
System.out.println("Days Left="+noOfDays+" Hours="+noOfHours+" Minutes="+noOfMinutes+" Seconds="+noSec); 
Cuestiones relacionadas