2010-11-10 35 views
2

J'ai la période suivante 1month 5d 22h 35m 39s, que je veux mettre en forme comme 35d 22h 35m 39s. Cependant lorsque vous utilisez le formatter suivant les mois sont tout simplement retirés et n'ont pas été ajoutées aux jours:Affichage période avec jours, heures, minutes et secondes

PeriodFormatter formatter = new PeriodFormatterBuilder() 
    .printZeroAlways() 
    .appendDays().appendSuffix(" d ") 
    .appendHours().appendSuffix(" h ") 
    .appendMinutes().appendSuffix(" m ") 
    .appendSeconds().appendSuffix(" s ") 
    .toFormatter(); 

Après quelques recherches, je trouve que l'on est censé utiliser la méthode normalizedStandard() sur la période, mais lors de l'utilisation avec period.normalizedStandard(PeriodType.dayTime()) j'obtiens l'erreur suivante:

java.lang.UnsupportedOperationException: Field is not supported 
    at org.joda.time.PeriodType.setIndexedField(PeriodType.java:690) 
    at org.joda.time.Period.withMonths(Period.java:851) 
    at org.joda.time.Period.normalizedStandard(Period.java:1541) 
    at amadeus.bid.wicket.markup.html.CountDownLabel.onComponentTagBody(CountDownLabel.java:34) 

Toutes les idées?

+0

peut-être que ça aide http://stackoverflow.com/questions/1440557/joda-time-period-to-string – Thariama

+0

Vous utilisez le même suffixe pour les mois et les minutes. –

+0

Gilbert: désolé censé enlever cela. – Kristoffer

Répondre

0

Je ne pense pas qu'il sera possible de convertir de façon fiable un certain nombre de mois dans une période en jours parce que le nombre de jours dans un mois varie.

Exemple:

//From: 1month 5d 22h 35m 39s 
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0); 
//To: 35d 22h 35m 39s. 
period.toStandardDays(); 

lève l'exception suivante: java.lang.UnsupportedOperationException: Ne peut pas convertir en jours en cette période contient des mois et des mois varient en longueur

1

Comme Elijah Cornell triste, en général cela n'a aucun sens de convertir des mois en jours que les mois varient en longueur.

Cependant peut imaginer une application où il est logique de plus de période à un début spécifique DateTime (par exemple l'heure), calc Duration du début à entraîner et convertir la durée d'une période de PeriodType.dayTime():

// 1 month 5d 22h 35m 39s 
Period period = new Period(0, 1, 0, 5, 22, 35, 39, 0); 

Instant start = new Instant(); 
// current time => 2011-03-17T22:24:01.848+01:00 
Duration dura = new Duration(start, start.toDateTime().plus(period)); 
Period period2 = new Period(dura).normalizedStandard(PeriodType.dayTime()); 
// => 36d 21h 35m 39s 

Bien le résultat dépend de début, son fuseau horaire, dépassant les limites de temps d'économie de jour, etc., et à ce moment ne donne pas le choix 35d 22h 35m 39s mais 36d 21h 35m 39s pourrait-il sens à mon avis, à cause de cela est un cas d'utilisation générale de Period à plus à un DateTime pour donner un nouveau DateTime.

+0

Merci pour votre réponse. Du point de vue des utilisateurs, je pense réellement qu'il est logique de montrer les jours au lieu de mois. Un système devrait être meilleur sur le calcul au lieu de laisser cela pour l'utilisateur. J'essaie de comprendre ce qui se passe dans votre exemple ci-dessus. Pourquoi ne fournit-il pas le désiré? – Kristoffer

+0

@Kristoffer Commençons la simplification avec 'Instant start = new Instant (" 2011-03-17T00: 00: 00.000 + 01: 00 ");'. Alors 'start.toDateTime(). Plus (période)' devient '2011-04-22T22: 35: 39.000 + 02: 00' à cause de' 04' est 1 mois après '03',' 22' est 5 jours après ' 17' et '22: 35: 39' est ... après' 00: 00: 00'. Mais 1. si vous comptez du 2011-03-17 au 2011-04-22, vous obtenez 36 jours. Et 2. l'heure manquante est de mettre en avant l'horloge à '2011-03-27' de' 02: 00' à '03: 00' (début de l'heure d'été), que vous pouvez voir en changeant l'écart de fuseau horaire utc de' +01: 00' à '+02: 00' aussi. – binuWADa

+0

@Kristoffer Si vous démarrez à la place avec 'Instant start = new Instant (" 2011-04-01T00: 00: 00.000 + 02: 00 "),' à l'intérieur de l'heure d'été et avec un mois de 30 jours (avril) '35d 22h 35m 39s'. Conclusion: Cela dépend de l'heure de départ comme déjà mentionné en post. – binuWADa