tl; dr
Convertissez vos obsolètes java.util.Date
objets à 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' PnYnMnDTnHnMnS
endroit où le P
moyen "Période", le T
sé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.Calendar
classes 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 Instant
classe 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 Period
et Duration
utiliser 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 Duration
obtenir 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 Duration
classe obtient de nouvelles méthodes pour renvoyer les différentes parties de jours, heures, minutes, secondes, millisecondes / nanosecondes. Appelez les to…Part
mé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
, YearQuarter
et 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 Period
classe 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