Tl;dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
ou
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
java.time
Pour info, le Joda-Time Le projet est maintenant en mode de maintenance L'équipe conseille la migration vers le java.time classes.
L'équivalent de Joda-Time DateTime
es 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 de la journée. Par exemple, commencer une minute avant minuit et finir une minute après minuit devrait donner un seul jour. Pour ce comportement, extrayez un LocalDate
de votre ZonedDateTime
. En LocalDate
représente une valeur de date uniquement, sans heure du jour et sans fuseau horaire.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Utilisez le ChronoUnit
enum pour calculer les jours écoulés ou d'autres unités.
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
Tronquer
Quant à votre question sur une façon plus générale de faire ce comptage où vous vous intéressez au delta des heures en tant qu'heure de l'horloge plutôt qu'aux heures complètes en tant qu'intervalles de temps de soixante minutes, utilisez la fonction truncatedTo
méthode.
Voici votre exemple de 14 h 45 à 15 h 12 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
Cela ne fonctionne pas pendant des jours. Utilisez toLocalDate() dans ce cas.
À propos de java.time
En java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
En Joda-Time Le projet, actuellement en mode de maintenance conseille de migrer vers le java.time classes.
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.*
classes.
Où obtenir les classes java.time ?
-
Java SE 8 , Java SE 9 , Java SE 10 et plus tard
- Intégré.
- Fait partie de l'API Java standard avec une mise en œuvre groupée.
- Java 9 ajoute quelques fonctionnalités et corrections mineures.
-
Java SE 6 y Java SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 & 7 dans Trois Dix-Backport .
-
Android
- Les versions ultérieures d'Android regroupent les implémentations des classes java.time.
- Pour les Android plus anciens (<26), le ThreeTenABP le projet s'adapte Trois Dix-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP .
En Trois-Dix-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval
, YearWeek
, YearQuarter
et plus .
En Trois-Dix-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval
, YearWeek
, YearQuarter
et plus .