La bibliothèque de classes Java a une classe nommée DateTime. DateTime a cette méthode:
int daysBetween(DateTime other)
qui retourne le nombre de jours entre cela et le paramètre. Il n'a pas de méthode
int secondsBetween(DateTime other)
dont j'ai besoin. Existe-t-il une classe similaire à DateTime mais disposant d'une telle méthode?
Pas familier avec DateTime ...
Si vous avez deux dates, vous pouvez appeler getTime pour obtenir des millisecondes, obtenir le diff et le diviser par 1000. Par exemple
Date d1 = ...;
Date d2 = ...;
long seconds = (d2.getTime()-d1.getTime())/1000;
Si vous avez des objets de calendrier, vous pouvez appeler
c.getTimeInMillis()
et faire de même
Tu devrais faire
org.joda.time.Seconds.secondBetween(date1, date2)
Ça devrait le faire:
Date a = ...;
Date b = ...;
Math.abs(a.getTime()-b.getTime())/1000;
Voici la documentation pertinente: Date.getTime () . Sachez que cela ne fonctionnera que pour des dates postérieures au 1er janvier 1970 à 00:00:00 GMT.
Je voudrais apporter la réponse moderne. Les autres réponses étaient bien quand cette question a été posée, mais le temps passe. Aujourd’hui, je vous recommande d’utiliser Java.time
, L’API moderne Java de date et d’heure .
ZonedDateTime aDateTime = ZonedDateTime.of(2017, 12, 8, 19, 25, 48, 991000000, ZoneId.of("Europe/Sarajevo"));
ZonedDateTime otherDateTime = ZonedDateTime.of(2017, 12, 8, 20, 10, 38, 238000000, ZoneId.of("Europe/Sarajevo"));
long diff = ChronoUnit.SECONDS.between(aDateTime, otherDateTime);
System.out.println("Difference: " + diff + " seconds");
Cela imprime:
Difference: 2689 seconds
ChronoUnit.SECONDS.between()
fonctionne avec deux objets ZonedDateTime
ou deux OffsetDateTime
s, deux LocalDateTime
s, etc.
Si vous avez besoin d'autre chose que de quelques secondes, vous devriez envisager d'utiliser la classe Duration
:
Duration dur = Duration.between(aDateTime, otherDateTime);
System.out.println("Duration: " + dur);
System.out.println("Difference: " + dur.getSeconds() + " seconds");
Cela imprime:
Duration: PT44M49.247S
Difference: 2689 seconds
La première des deux lignes imprime la durée au format ISO 8601, la sortie signifie une durée de 44 minutes et 49.247 secondes.
La classe Date
utilisée dans plusieurs des autres réponses est maintenant obsolète. Joda-Time également utilisé dans un couple (et éventuellement dans la question) est maintenant en mode maintenance, aucune amélioration majeure n'est prévue, et les développeurs recommandent officiellement de migrer vers Java.time
, Également appelé JSR-310.
Si vous utilisez au moins Java 6 , vous pouvez.
Il n’existe pas de classe telle que DateTime
dans l’API standard Java. Bien qu’il en existe une dans joda-time, même si elle n’a pas de méthode daysBetween
.
Utilisation de l’API standard Java, le moyen le plus simple d’obtenir des secondes entre deux Java.util.Date
_ objets seraient de soustraire leurs horodatages et de les diviser par 1000:
int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;
Si vous utilisez Joda (qui peut arriver sous la forme jsr 310 dans JDK 7, séparez les api open source jusque-là), il existe une classe Seconds avec une méthode secondsBetween.
Voici le lien javadoc: http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween (org.joda.time.ReadableInstant,% 20org.joda. time.ReadableInstant)
Il n'est pas recommandé d'utiliser Java.util.Date
Ou System.currentTimeMillis()
pour mesurer les temps écoulés. Il n’est pas garanti que ces dates soient monotones et des changements se produiront lors de la modification de l’horloge système (par exemple lorsqu’elle est corrigée à partir du serveur). Probablement, cela se produira rarement, mais pourquoi ne pas coder une meilleure solution plutôt que de s’inquiéter d’éventuels changements négatifs ou très importants?
Au lieu de cela, je recommanderais d'utiliser System.nanoTime()
.
long t1 = System.nanoTime();
long t2 = System.nanoTime();
long elapsedTimeInSeconds = (t2 - t1) / 1000000000;
[~ # ~] éditer [~ # ~]
Pour plus d'informations sur la monoticité, consultez le réponse à une question connexe que j'ai posée, dans la mesure du possible, nanoTime utilise une horloge monotone. J'ai testé, mais uniquement sous Windows XP, Java 1.6 et en modifiant l'horloge dans laquelle nanoTime
était monotone et currentTimeMillis
ne l'était pas.).
Aussi de document en temps réel de Java :
Q: 50. Le temps renvoyé via l'horloge temps réel est-il d'une meilleure résolution que celle renvoyée par System.nanoTime ()?
L'horloge en temps réel et System.nanoTime () sont toutes deux basées sur le même appel système et donc sur la même horloge.
Avec Java RTS, toutes les API basées sur le temps (par exemple, les temporisations, les threads périodiques, la surveillance des dates limites, etc.) sont basées sur le minuteur haute résolution. priorités, ils peuvent s’assurer que le code approprié sera exécuté au bon moment pour les contraintes en temps réel. En revanche, les API ordinaires Java SE offrent uniquement quelques méthodes capables de gérer des temps de résolution élevés. , sans aucune garantie d’exécution à un moment donné. Utiliser System.nanoTime () entre différents points du code pour effectuer des mesures de temps écoulé doit toujours être précis.
Vous pouvez utiliser org.Apache.commons.lang.time.DateUtils
pour le rendre plus propre:
(firstDate.getTime() - secondDate.getTime()) / DateUtils.MILLIS_PER_SECOND
Utilisez cette méthode:
private Long secondsBetween(Date first, Date second){
return (second.getTime() - first.getTime())/1000;
}
Quelle classe ? Voulez-vous dire la classe Joda DateTime ? Si tel est le cas, vous pouvez simplement appeler getMillis()
sur chacun d'eux et effectuer la soustraction/mise à l'échelle appropriée.
Je recommanderais Joda pour le travail de date/heure, d'ailleurs, en raison de son API utile et intuitive, et de son thread-safety pour les options de formatage/d'analyse.
Juste un pointeur: si vous calculez la différence entre deux méthodes Java.util.Date, il est raisonnable de soustraire les deux dates et de les diviser par 1000, mais faites particulièrement attention si vous obtenez votre référence Java.util.Date à partir d'un objet Calendar. . Dans ce cas, vous devez tenir compte de l'heure d'été de votre fuseau horaire, car l'une des dates que vous utilisez peut avoir lieu pendant une période d'heure d'été.
Cela est expliqué sur le lien de Prasoon, je recommande de prendre un peu de temps pour le lire.