2010-10-27 3 views
1

Comment se fait ce test que j'ai écrit échoue dans jodatime 1.6.2? Est-ce un bug?Bug en jodatime Période?

@Test 
public void testIfJodaTimePeriodsHandlesPeriodTypesOtherThanMinutesAndHours() { 
    long twentyDaysInMillis = TimeUnit.MILLISECONDS.convert(20, TimeUnit.DAYS); 
    Period twoWeeks = new Period(twentyDaysInMillis, PeriodType.weeks()); 
    Assert.assertEquals(2, twoWeeks.getWeeks()); 
// twoWeeks.getWeeks() actually returns 0!! 
} 

Pour votre information, les périodes avec tous les PeriodTypes ne remplissent que dans les champs pour les minutes et heures, même si les Millis passés aux montants du constructeur à plus de 25 heures. C'est contre-intuitif.

+0

Suivi: L'échec du test suivant est une "fonctionnalité" décrite dans les documents de Period.normalizedStandard(): @Test public void assertJodaTimeFormatsYears() { \t Période p = nouvelle période (TimeUnit.MILLISECONDS.convert (380, TimeUnit.DAYS)). normalizedStandard(); \t Assert.assertEquals (1, p.getYears()); } Quelle est la méthode recommandée pour faire déborder les semaines dans les champs mois et années? – eirirlar

Répondre

5

C'est ainsi que fonctionne Period dans JodaTime.

Period possède des champs précis (heures, minutes, secondes, millisecondes) et des champs imprécis (autres). Les champs imprécis peuvent être affectés par l'heure d'été. C'est-à-dire, Period de 24 heures peut être inférieur à un jour ou plus d'un jour sur une limite de l'heure avancée.

Par conséquent, les constructeurs qui prennent des millisecondes ne remplissent que des champs précis. Pour initialiser les champs imprécis (sans prendre des économies de jour en compte) dont vous avez besoin:

Period twoWeeks = new Period(twentyDaysInMillis).normalizedStandard(PeriodType.weeks()); 

Voir aussi:

+0

Mon mauvais pour ne pas lire les docs correctement, je suppose. Merci pour la réponse informative! – eirirlar