java - tag - taille balise title 2018




Nombre de jours entre deux dates dans Joda-Time (4)

Classe de Days

L'utilisation de la classe Days avec la méthode withTimeAtStartOfDay devrait fonctionner:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

Comment puis-je trouver la différence entre les jours entre deux instances Joda-Time DateTime ? Avec «différence de jours», je veux dire si le départ est le lundi et la fin est le mardi, j'attends une valeur de retour de 1 indépendamment de l'heure / minute / secondes des dates de début et de fin.

Days.daysBetween(start, end).getDays() me donne 0 si le départ est le soir et se termine le matin.

J'ai aussi le même problème avec d'autres champs de date, alors j'espérais qu'il y aurait une façon générique d '«ignorer» les champs de moindre importance.

En d'autres termes, les mois entre février et le 4 mars seraient également 1, tout comme les heures entre 14h45 et 15h12. Cependant, la différence d'heure entre 14:01 et 14:55 serait 0.


tl; dr

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.truncatedTo( ChronoUnit.DAYS )  , 
    later.truncatedTo( ChronoUnit.DAYS ) 
)

…ou…

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

Pour votre information, le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time .

L'équivalent de Joda-Time DateTime est ZonedDateTime .

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

Apparemment, vous voulez compter les jours par dates, ce qui signifie que vous voulez ignorer l'heure du jour. Par exemple, commencer une minute avant minuit et se terminer une minute après minuit devrait entraîner un seul jour. Pour ce comportement, extrayez un LocalDate partir de votre ZonedDateTime . La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

Utilisez l'enum ChronoUnit pour calculer les jours écoulés ou d'autres unités.

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

Tronquer

Quant à vous poser des questions sur une façon plus générale de faire ce comptage où vous êtes intéressé par le delta des heures que l'heure de l'horloge plutôt que des heures complètes comme des intervalles de soixante minutes, utilisez la méthode truncatedTo .

Voici votre exemple de 14h45 à 15h12 le même jour.

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );

1

Pour un nombre de jours par dates, tronquer à ChronoUnit.DAYS . Voici un exemple passant de minuit cinq minutes avant à cinq minutes après, pour les jours écoulés de 1 .

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 23 , 55 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 18 , 00 , 05 , 0 , 0 , z );

long days = ChronoUnit.DAYS.between( start.truncatedTo( ChronoUnit.DAYS ) , stop.truncatedTo( ChronoUnit.DAYS ) );

1

À propos de java.time

Le framework java.time est intégré dans Java 8 et java.time ultérieures. Ces classes remplacent les vieilles classes de date-heure legacy , telles que java.util.Date , Calendar et SimpleDateFormat .

Le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le tutoriel Oracle . Et recherchez pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.* Classes.

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 et versions ultérieures
    • 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
    • La plupart des fonctionnalités de java.time sont reportées sur Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundle Android des classes java.time.
    • Pour Android plus ancien (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP ....

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter , et more .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter , et more .


Malheureusement, la réponse withTimeAtStartOfDay est fausse, mais seulement de temps en temps. Tu veux:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

Il se trouve que "minuit / début de journée" signifie parfois 1h du matin (l'heure d'été arrive de cette façon à certains endroits), ce que Days.DaysBetween ne gère pas correctement.

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

En passant par un LocalDate contourne l'ensemble du problème.


vous pouvez utiliser LocalDate :

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 






jodatime