121 votes

Java 8: Calculer la différence entre deux ZonedDateTime

J'essaie d'écrire une méthode pour imprimer la différence de temps entre deux ZonedDateTime , 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 .

162voto

Michał Szewczyk Points 2011

Vous pouvez utiliser la méthode entre de ChronoUnit.

Cette méthode convertit ces moments-là pour la même zone (zone du premier argument) et après que, invoque jusqu' méthode déclarée dans Temporelles de l'interface:

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

Depuis deux ZonedDateTime et LocalDateTime met en œuvre Temporelle de l'interface, vous pouvez écrire aussi de méthode universelle pour les date-heure de types:

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 mixte LocalDateTime et ZonedDateTime conduit à DateTimeException.

Espérons que cela aide.

106voto

Basil Bourque Points 8938

tl;dr

Pendant des heures, minutes, 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

La Réponse par Michal S est correcte, montrant ChronoUnit.

Duration & Period

Une autre voie est l' Duration et Period les classes. Utiliser le premier pour de courtes périodes de temps (heures, minutes, secondes), le second pour le plus de temps (années, mois, jours).

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

Produire une Chaîne de caractères dans la norme ISO 8601 en appelant toString. Le format est - PnYnMnDTnHnMnS où l' P marque le début et T sépare les deux parties.

String output = d.toString();

En Java 9 et plus tard, appel de l' to…Part méthodes pour obtenir les composants individuels. Discuté dans une autre Réponse de la mine.

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[America/Montreal]/2016-12-11T06:14:50.639-05:00[America/Montreal]

PT3H7M

Voir le code en direct en IdeOne.com.

Interval & LocalDateRange

Le ThreeTen-Extra projet ajoute des fonctionnalités à la java.les classes de temps. L'un de ses pratique des classes est - Interval pour représenter un laps de temps comme une paire de points sur la timeline. Un autre est - LocalDateRange, pour une paire de LocalDate objets. En revanche, l' Period & Duration classes représentent chacun un laps de temps que pas attaché à la timeline.

La méthode de factorisation pour Interval prend une paire de Instant objets.

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

Vous pouvez obtenir un Duration d'un Interval.

Duration d = interval.toDuration();

À propos de java.le temps

Le java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieil héritage de la date-l'heure des classes d' java.util.Date, Calendar, & SimpleDateFormat.

Le Joda-Time , qui est maintenant en mode de maintenance, conseille la migration à la java.du temps des classes.

Pour en savoir plus, voir l' Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification JSR 310.

Vous pouvez échanger java.le temps des objets directement avec votre base de données. L'utilisation d'un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin d' java.sql.* les classes.

Où obtenir le java.les classes de temps?

Le ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme Interval, YearWeek, YearQuarter, et plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X