2010-01-19 8 views
1

J'ai créé une méthode qui prend deux dates (en millisecondes) et renvoie une phrase qui indique la durée entre ces deux dates.Définition correcte d'une durée à l'aide de JodaTime

Pour le moment, j'ai ce code:

public static String formatDuration(long start, long end) { 
    Interval interval = new Interval(start, end); 
    return getPeriodFormatter().print(interval.toPeriod()).trim(); 
} 

private static PeriodFormatter getPeriodFormatter() { 
    PeriodFormatter pf = new PeriodFormatterBuilder().printZeroRarelyFirst() 
     .appendYears().appendSuffix("y ", "y ") 
     .appendMonths().appendSuffix("m" , "m ") 
     .appendDays().appendSuffix("d ", "d ") 
     .appendHours().appendSuffix("h ", "h ") 
     .appendMinutes().appendSuffix("m ", "m ") 
     .appendSeconds().appendSuffix("s ", "s ") 
     .toFormatter(); 

    return pf; 
} 

Cependant, je pense que je comprends mal la façon dont je dois définir un intervalle JodaTime. Si je tente le code de test suivant:

@Test 
public void foobar() { 
    try { 
     TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy"); 
     long start = sdf.parse("10:30:00 24/06/2009").getTime(); 
     long end = sdf.parse("23:05:17 22/08/2009").getTime(); 
     System.out.println("Duration: " + formatDuration(start, end)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     fail("Could not test duration."); 
    } 
} 

je reçois la sortie suivante, ce qui est faux (en particulier de la part de jour):

Duration: 1m 1d 12h 35m 17s 

Comment définir la durée correcte JodaTime?


Ok, en fait, ce que j'ai oublié dans mon PeriodFormatter est d'ajouter les semaines. Donc, si je rajoute les semaines, je reçois la sortie suivante, ce qui est correct:

Duration: 1m 4w 1d 12h 35m 17s 

Ma question change un peu: Y at-il un moyen d'afficher le nombre de jours au mois, au lieu des semaines + jours? En d'autres termes, d'autres au lieu d'avoir:

Duration: 1m 4w 1d 12h 35m 17s 

Je veux avoir:

Duration: 1m 29d 12h 35m 17s 
+0

En passant, je vous recommande également d'utiliser le Joda DateTimeFormat et les classes connexes plutôt que les formateurs JDK. –

Répondre

5

essayer.

Period period = interval.toPeriod(PeriodType.yearMonthDayTime()); 

Avant le formatage de la période.

+1

Juste pour ajouter à cela - le problème est que vous n'imprimiez pas les semaines, qui ont été incluses dans la période standard. –