2010-02-10 15 views
5

Tengo problemas para usar PeriodFormatter de Joda Time. Quiero que informe los días, las horas, los minutos y los segundos, pero mi intento parece estar cerrando semanas. ¿Qué debería estar haciendo diferente?My PeriodFormatter no se está comportando como esperaba, ¿qué he hecho mal?

import org.joda.time.DateTime; 
import org.joda.time.Period; 
import org.joda.time.format.PeriodFormatter; 
import org.joda.time.format.PeriodFormatterBuilder; 

public class Problems { 

    public static void main(String[] args) { 

     PeriodFormatter formatter = new PeriodFormatterBuilder() 
      .printZeroNever() 
      .appendDays() 
      .appendSuffix(" day", " days") 
      .appendSeparator(", ") 
      .appendHours() 
      .appendSuffix(" hour", " hours") 
      .appendSeparator(", ") 
      .appendMinutes() 
      .appendSuffix(" minute", " minutes") 
      .appendSeparator(", ") 
      .appendSeconds() 
      .appendSuffix(" second", " seconds") 
      .toFormatter(); 

     DateTime now = new DateTime(); 
     DateTime justUnderAWeekAgo = now.minusDays(7).plusMinutes(1); 
     DateTime justOverAWeekAgo = now.minusDays(7).minusMinutes(1); 
     System.out.println(now); 
     System.out.println(justUnderAWeekAgo); 
     System.out.println(justOverAWeekAgo); 
     // I am happy with the following: 
     System.out.println(
      formatter.print(new Period(justUnderAWeekAgo, now))); 
     // But not with this (outputs "1 minute" but I want "7 days, 1 minute"): 
     System.out.println(
      formatter.print(new Period(justOverAWeekAgo, now))); 
    } 
} 

EDIT: supongo que puedo ver por qué esto no está funcionando - es decir, que el formateador sólo imprime diversos valores de la época, y desde Períodos almacenar un valor de semanas, el valor para el día de mi problema el período es de hecho 0. Pero todavía necesito una buena forma de hacerlo ...

Respuesta

12

El problema en su caso es que no le pide a su PeriodFormatter que muestre las semanas.

dos posibilidades:

Solución 1: Display las semanas:

PeriodFormatter formatter = new PeriodFormatterBuilder() 
     .printZeroNever() 
     .appendWeeks() 
     .appendSuffix(" week", " weeks") 
     .appendSeparator(", ") 
     .appendDays() 
     .appendSuffix(" day", " days") 
     .appendSeparator(", ") 
     .appendHours() 
     .appendSuffix(" hour", " hours") 
     .appendSeparator(", ") 
     .appendMinutes() 
     .appendSuffix(" minute", " minutes") 
     .appendSeparator(", ") 
     .appendSeconds() 
     .appendSuffix(" second", " seconds") 
     .toFormatter(); 

La segunda salida en su ejemplo será:

1 week, 1 minute 

Solución 2: mostrar sólo los días entonces tendrá que usar el PeriodType.yearMonthDayTime():

new Period(justUndeAWeekAgo, now, PeriodType.yearMonthDayTime()); 

Usando esta segunda solución, puede mantener su PeriodFormatter como está ahora. La segunda salida en su ejemplo será entonces:

7 days, 1 minute 
+0

Falta un separador para las semanas - agregado. – ripper234

Cuestiones relacionadas