2010-02-10 6 views
5

Non riesco a utilizzare il periodema di Joda Time. Voglio uno per segnalare giorni, ore, minuti e secondi, ma il mio tentativo sembra essere in giro settimane. Cosa dovrei fare in modo diverso?My PeriodFormatter non si comporta come mi aspetto - cosa ho fatto di sbagliato?

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: Credo di poter capire perché questo non sta funzionando - vale a dire che il formattatore si limita a stampare diversi valori del periodo, e poiché periodi memorizzare un valore per settimane, il valore per giorni e giorni il mio problema periodo è effettivamente 0. Ma ho ancora bisogno di un buon modo per farlo ...

risposta

12

Il problema nel tuo caso è che non chiedi al tuo PeriodFormatter di visualizzare le settimane.

due possibilità:

Soluzione 1: Visualizzare le settimane:

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 seconda uscita nel tuo esempio sarà:

1 week, 1 minute 

Soluzione 2: Visualizzare solo i giorni quindi dovrai utilizzare lo PeriodType.yearMonthDayTime():

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

Utilizzando questa seconda soluzione, è possibile mantenere il vostro PeriodFormatter come è ora. La seconda uscita nel tuo esempio sarà quindi:

7 days, 1 minute 
+0

Ti mancava un separatore per le settimane - aggiunto. – ripper234

Problemi correlati