2014-06-06 8 views
2

J'ai utilisé Joda-Timejoda-time-2.3.jar pour la journée de calcul avec l'application Android. Mon code est ...Problèmes Joda-Time période dans certains cas

Period Nextperiod = new Period(ddate, nextdt,PeriodType.yearMonthDay()); 

Dans ce ddate et nextdt sont DateTime les deux dates sont le type d'entrée qui est le format avec SimpleDateFormat, pour la différence de jour où je l'ai utilisé Nextperiod.getDays() maintenant Cas de test sont,

Case 1 Right 
ddate=2014-06-01T00:00:00.000+05:30 
nextdt =2015-04-11T00:00:00.000+05:30 
Day: 10 
Month: 10 
year: 0

Case 2 Wrong ddate= 2014-05-28T00:00:00.000+05:30 nextdt=2015-03-12T00:00:00.000+05:30 Day: 12 Month: 9 year: 0

Dans le cas 2, il devrait être 14 et Lorsque j'insère 29 mai ou 30 mai les 12 sont le même résultat. Je ne sais pas ce qui ne va pas avec cette date. J'ai testé un peu plus la date et le résultat sont selon mes attentes. Laissez-moi savoir mon erreur.
Également essayé,
Period Nextperiod = new Period(new LocalDate(Ddate), new LocalDate(Ddate),PeriodType.yearMonthDay());
Merci D'avance.

+0

Pour votre information, le projet [Joda-Time] (http://www.joda.org/joda-time/) est maintenant en [mode maintenance] (https://en.wikipedia.org/wiki/Maintenance_mode), l'équipe conseillant la migration vers les classes [java.time] (http://docs.oracle.com/javase/9/docs/api/java/time/package-summary.html). Voir [Tutoriel Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Répondre

2

Vous pouvez voir pourquoi l'exemple Case 2 est correct si vous essayez d'ajouter 9 mois et 12 jours à votre date de début (ddate) pas à pas.

Ajout de 9 mois au 2014-05-28 résultats en 2015-02-28. C'est le dernier jour de février 2015, ajoutant ainsi 12 jours de rendements le 2015-03-12.

Cela s'applique également aux scénarios de test dont la date de début est le 29 mai ou le 30 mai: la période entre ces dates et la date de fin est de 9 mois et 12 jours.

+0

Bonne réponse Je suis tellement stupide !! +1 pour ça –

0

tl; dr

java.time.Period.between(startLocalDate , stopLocalDate) 

java.time

Le accepted Answer par Modus Tollens est correcte.

FYI, le projet Joda-Time est maintenant en maintenance mode, l'équipe conseillant la migration vers les classes java.time. Voir Tutorial by Oracle.

Voici la version moderne de votre code.

L'analyse de vos chaînes est OffsetDateTime car elles incluent un décalage par rapport à l'UTC mais pas un fuseau horaire complet.

OffsetDateTime start = OffsetDateTime.parse("2014-05-28T00:00:00.000+05:30") ; 

Il est préférable d'utiliser un fuseau horaire plutôt qu'un décalage, s'il est connu.

ZoneId z = ZoneId.of("Asia/Kolkata") ; 
ZonedDateTime start = LocalDate.parse("2014-05-28").atStartOfDay(z) ; 

Si votre voulez vraiment travailler avec une date seulement au lieu d'un moment date-heure, utilisez la classe LocalDate.

LocalDate start = LocalDate.parse("2014-05-28") ; 

Vous pouvez extraire une date que LocalDate soit du OffsetDateTime ou ZonedDateTime en appelant toLocalDate.

Représente l'intervalle de temps que vous voulez sauter en utilisant la classe Period.

Period p = Period.ofMonths(9).plus(Period.ofDays(12)) ; 

Vérifiez que cette valeur en générant une chaîne est le format ISO 8601 standard.

String pOutput = p.toString() ; 

P9M12D

Ajouter la période à la date de début ou date-heure.

LocalDate later = start.plus(p) ; // Add the `Period` span-of-time to our starting date. 

Pour calculer le temps écoulé, utilisez Period.between.

Period p = Period.between(startLocalDate , stopLocalDate) ; 

A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes legacy de date-heure gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android
    • Les versions ultérieures de mises en œuvre bundle Android des classes java.time.
    • Pour Android plus tôt, le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir How to use ThreeTenABP….
Questions connexes