web-dev-qa-db-fra.com

Java 8: calcule la différence entre deux ZonedDateTime

J'essaie d'écrire une méthode pour imprimer la différence de temps entre deux ZonedDateTime s, en ce qui concerne la différence entre les fuseaux horaires.

J'ai trouvé des solutions mais toutes ont été écrites pour fonctionner avec LocalDateTime.

51
Maggie Hill

Vous pouvez utiliser la méthode entre de ChronoUnit .

Cette méthode convertit ces heures dans la même zone (zone du premier argument) et après cela, invoque jusqu'à méthode déclarée dans l'interface Temporal:

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

Étant donné que ZonedDateTime et LocalDateTime implémentent l'interface Temporal, vous pouvez également écrire une méthode universelle pour ces types date-heure:

static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

Mais gardez à l'esprit que l'invocation de cette méthode pour une combinaison de LocalDateTime et ZonedDateTime entraîne DateTimeException.

J'espère que ça aide.

64
Michał Szewczyk

tl; dr

Pendant des heures, des minutes et des secondes:

Duration.between( zdtA , zdtB )  // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).

Pendant des années, des mois, des jours:

Period.between(                  // Represent a span-of-time in terms of years-months-days. 
    zdtA.toLocalDate() ,         // Extract the date-only from the date-time-zone object. 
    zdtB.toLocalDate() 
)

Détails

Le Answer by Michal S est correct, montrant ChronoUnit .

Duration & Period

Une autre route est la classe Duration et Period . Utilisez le premier pour des périodes plus courtes (heures, minutes, secondes), le second pour les plus longues (années, mois, jours).

Duration d = Duration.between( zdtA , zdtB );

Produisez une chaîne dans format ISO 8601 standard en appelant toString. Le format est PnYnMnDTnHnMnSP marque le début et T sépare les deux parties.

String output = d.toString();

Dans Java 9 et versions ultérieures, appelez le to…Part méthodes pour obtenir les composants individuels. Discuté dans ne autre de mes réponses .

Exemple de code

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtStart = ZonedDateTime.now( z );
ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 );

Duration d = Duration.between( zdtStart , zdtStop );

2016-12-11T03: 07: 50.639-05: 00 [Amérique/Montréal] /2016-12-11T06:14:50.639-05:00 [Amérique/Montréal]

PT3H7M

Voir code live sur IdeOne.com .

Interval & LocalDateRange

Le projet ThreeTen-Extra ajoute des fonctionnalités aux classes Java.time. Une de ses classes pratiques est Interval pour représenter une période de temps sous la forme d'une paire de points sur la timeline. Un autre est LocalDateRange , pour une paire d'objets LocalDate . En revanche, les classes Period et Duration représentent chacune un intervalle de temps tel que et non attaché à la timeline.

La méthode d'usine pour Interval prend une paire d'objets Instant.

Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );

Vous pouvez obtenir un Duration à partir d'un Interval.

Duration d = interval.toDuration();

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien problème - legacy classes date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , actuellement en mode de maintenance , conseille de migrer vers le Java.time = cours.

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

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

Où obtenir les classes Java.time?

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

58
Basil Bourque