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 Réponses :
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 ...
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 ()
.
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.
Oui.
Voici le code pertinent:
public BaseDateTime(long instant) { this(instant, ISOChronology.getInstance()); }
public BaseDateTime() { this(DateTimeUtils.currentTimeMillis(), ISOChronology.getInstance()); }
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).
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.
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.
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 entreLocalDateTime
,Instant
,ZonedDateTime
etOffsetDateTime
, 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.