tl; dr
Convertissez vos obsolètes java.util.Dateobjets à leur remplacement, java.time.Instant. Ensuite, calculez le temps écoulé comme a Duration.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
Format ISO 8601: PnYnMnDTnHnMnS
La norme sensée ISO 8601 définit une représentation textuelle concise d'une période de temps en nombre d'années, mois, jours, heures, etc. La norme appelle une telle période une durée . Le format est l' PnYnMnDTnHnMnSendroit où le Pmoyen "Période", le Tsépare la partie date de la partie heure, et entre les deux sont des nombres suivis d'une lettre.
Exemples:
P3Y6M4DT12H30M5S
trois ans, six mois, quatre jours, douze heures, trente minutes et cinq secondes
PT4H30M
Quatre heures et demie
java.time
Le framework java.time intégré à Java 8 et versions ultérieures supplante les anciennes java.util.Date/ java.util.Calendarclasses gênantes . Les nouvelles classes sont inspirées par le framework Joda-Time très réussi , destiné à lui succéder, de concept similaire mais ré-architecturé. Défini par JSR 310 . Prolongé par le projet ThreeTen-Extra . Voir le tutoriel .
Moment
La Instantclasse représente un moment sur la chronologie en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Mieux vaut éviter les anciennes classes telles que Date/ Calendar. Mais si vous devez interagir avec l'ancien code qui n'a pas encore été mis à jour vers java.time , convertissez-le d'avant en arrière. Appelez de nouvelles méthodes de conversion ajoutées aux anciennes classes. Pour passer d'un java.util.Dateà un Instant, appelez Date::toInstant.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Durée
Les classes java.time ont divisé cette idée de représenter une période de temps en nombre d'années, mois, jours, heures, minutes, secondes en deux moitiés:
Period pendant des années, des mois, des jours
Duration pour jours, heures, minutes, secondes
Voici un exemple.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Dump sur console.
Les deux Periodet Durationutiliser l' ISO 8601 standard pour générer une représentation chaîne de leur valeur.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
maintenant: 2015-11-26T00: 46: 48.016-05: 00 [Amérique / Montréal] à l'avenir: 2015-11-26T00: 46: 48.016-05: 00 [Amérique / Montréal] = PT1H3M
Java 9 ajoute des méthodes pour Durationobtenir la partie jours, la partie heures, la partie minutes et la partie secondes.
Vous pouvez obtenir le nombre total de jours ou d'heures ou de minutes ou de secondes ou de millisecondes ou de nanosecondes sur toute la durée.
long totalHours = duration.toHours();
Dans Java 9, la Durationclasse obtient de nouvelles méthodes pour renvoyer les différentes parties de jours, heures, minutes, secondes, millisecondes / nanosecondes. Appelez les to…Partméthodes suivantes : toDaysPart(), toHoursPart()et ainsi de suite.
ChronoUnit
Si vous ne vous souciez que d'une granularité de temps plus simple et plus grande, comme le «nombre de jours écoulés», utilisez l' ChronoUniténumération.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Un autre exemple.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers java.time.
Pour en savoir plus, consultez le didacticiel Oracle . 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 et SE 9 et versions ultérieures
- Intégré.
- Une partie de l'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
- Java SE 6 et SE 7
- Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
- Android
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .
Joda-Time
MISE À JOUR: Le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time . Je laisse cette section intacte pour l'histoire.
La bibliothèque Joda-Time utilise ISO 8601 pour ses valeurs par défaut. Sa Periodclasse analyse et génère ces chaînes PnYnMnDTnHnMnS.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Rendu:
period: PT4H30M