web-dev-qa-db-fra.com

En Java, comment obtenir la différence en secondes entre 2 dates?

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?

61
snakile

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

150
Scott Stanchfield

Tu devrais faire

org.joda.time.Seconds.secondBetween(date1, date2)
9
Pascal-Louis Perez

Ç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.

7
Johannes Weiss

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 OffsetDateTimes, deux LocalDateTimes, 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.

Pourquoi Java.time?

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.

Question: Puis-je utiliser l'API moderne avec ma version Java?

Si vous utilisez au moins Java 6 , vous pouvez.

6
Ole V.V.

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;
5
andri

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)

3
cserepj

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.

3
Pool

Vous pouvez utiliser org.Apache.commons.lang.time.DateUtils pour le rendre plus propre:

(firstDate.getTime() - secondDate.getTime()) / DateUtils.MILLIS_PER_SECOND
2
shem

Utilisez cette méthode:

private Long secondsBetween(Date first, Date second){
    return (second.getTime() - first.getTime())/1000;
}
0
Mauro Midolo

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.

0
Brian Agnew

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.

0
Fabio Kenji