1
votes

Les méthodes DateTime.now () et new DateTime (System.currentTimeMillis ()) sont-elles égales en Java?

J'ai besoin de savoir, en java (ma version jdk 8), je peux remplacer, new DateTime (System.currentTimeMillis ()) cette forme de code, ' DateTime.now () '?

J'ai utilisé le package import org.joda.time.DateTime;

Comment écrire cette même chose en java 8 (date et heure)?


4 commentaires

N'utilisez pas la bibliothèque joda avec jdk8. Le package java.time dans jdk8 est très similaire à joda, il est donc inutile d'avoir les deux.


@DawoodibnKareem comment écrire cette même chose en java 8?


L'équivalent java.time de la classe DateTime de joda s'appelle ZonedDateTime. Vous voulez écrire ZonedDateTime.now () . Mais je pense que vous devriez lire la différence entre LocalDateTime , Instant , ZonedDateTime et OffsetDateTime , car il y a similitudes entre les quatre classes, et vous devez choisir la bonne pour vos besoins particuliers.


Vous pouvez également passer une horloge dans une surcharge de la méthode now. Les tests peuvent fournir une implémentation stub de l'horloge afin que votre test puisse spécifier une heure.


4 Réponses :


3
votes

Dans Java 8, DateTime correspond à java.time.ZonedDateTime et java.time.OffsetDateTime .

Cette page est écrite par le créateur / auteur / mainteneur de Joda Time et elle recommande:

Si vous écrivez du code en Java SE 8, il est temps de migrer vers java.time ...


3 commentaires

pouvez-vous me dire comment prendre java 8, cette même chose? 'DateTime.now ()' ou .'new DateTime (System.currentTimeMillis ()) '?


'LocalDateTime localDateTime = LocalDateTime.now (); est-ce correct ?


@uma Non, utilisation incorrecte de LocalDateTime . Cette classe ne peut pas être utilisée pour suivre un moment car elle ne dispose d'aucun concept de fuseau horaire ou de décalage par rapport à UTC. Cette classe n'est pas pertinente pour la discussion sur cette page. Je ne peux pas imaginer un cas où il serait utile d'appeler LocalDateTime.now () .



1
votes

Oui. new DateTime (System.currentTimeMillis ()) appellera

public BaseDateTime() {
    this(DateTimeUtils.currentTimeMillis(), ISOChronology.getInstance());
}

puis

public DateTime() {
    super();
}

et DateTime .now () appellera

public static DateTime now() {
    return new DateTime();
}

puis

public BaseDateTime(long instant) {
    this(instant, ISOChronology.getInstance());
}

puis

public DateTime(long instant) {
    super(instant);
}

qui est identique à la première manière.


0 commentaires

1
votes

Oui.

Voici le code pertinent:

public BaseDateTime(long instant) {
    this(instant, ISOChronology.getInstance());
}
public BaseDateTime() {
    this(DateTimeUtils.currentTimeMillis(), ISOChronology.getInstance());
}


0 commentaires

4
votes

tl;dr
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

En interne, le moment est suivi en tant que nombre de secondes entières plus une fraction de seconde en nombre de nanosecondes, depuis la référence d'époque de 1970-01-01T00: 00 : 00Z (le Z signifie UTC).

java.time

Votre classe DateTime est apparemment de la bibliothèque Joda-Time. Le créateur de cette bibliothèque, Stephen Colebourne, a remplacé Joda-Time par les classes java.time intégrées à Java 8 et versions ultérieures, selon JSR 310.

Instant

Pour un instant en UTC, utilisez Instant . Pour capturer l'instant courant en UTC, Instant.now().

Instant représente un décompte de nanosecondes depuis la référence d'époque du premier moment de 1970 à UTC.

L'appel à System.currentTimeMillis () est le même, un décompte depuis le début de 1970 UTC, sauf une résolution plus grossière de millisecondes plutôt que de nanosecondes. Dans la pratique, les horloges informatiques conventionnelles ne peuvent pas suivre avec précision le moment actuel en nanosecondes, donc capturer le moment actuel avec Instant ne peut capturer que des microsecondes (typique de Java 9 et versions ultérieures) ou des millisecondes (en Java 8). / p>

Le résultat: Il n'est pas nécessaire d'appeler System.currentTimeMillis() . Utilisez plutôt Instant.now () .

ZonedDateTime

L'équivalent de DateTime serait ZonedDateTime . Cette classe représente un moment vu à travers l'heure de l'horloge murale utilisée par les habitants d'une région particulière (un fuseau horaire).

java.time.Instant.now()  // Capture the current moment in UTC. 


3 commentaires

Instant ne représente pas «un moment UTC». Il représente un point dans le temps, pas du tout affecté par les fuseaux horaires.


@Holger Votre point me semble pédant, et pas du tout utile à quelqu'un qui essaie d'apprendre le sujet délicat de la gestion de la date et de l'heure. À mon avis, un décompte de nanosecondes à partir du premier moment de 1970 UTC permet de garder une trace de l'heure UTC, est un moment UTC. En quoi pas un moment UTC? Quelle utilité votre point me fournit-il qui me manque?


Surtout lorsqu'on essaie d'apprendre un sujet délicat, il est important de ne pas polluer un concept avec des choses inappropriées. Un Instant représente un moment dans le temps, où que je me trouve dans le monde. Un Instant est le premier choix lorsque je ne souhaite pas gérer les fuseaux horaires. Il est distrayant d'étiqueter quelque chose qui n'est pas connecté à un fuseau horaire avec «UTC», qui est un fuseau horaire. En interne , il est stocké sous forme de décompte de 1970-01-01T00: 00: 00Z , donc la valeur de référence est une date dans le fuseau horaire UTC. La valeur de référence pour la température a une pression, mais une température n'a pas de pression.