tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
Connaissez vos données
Les gens utilisent diverses précisions dans le suivi du temps sous forme de nombre depuis une époque . Ainsi, lorsque vous obtenez des nombres à interpréter comme un décompte depuis une époque, vous devez déterminer:
- Quelle époque?
De nombreuses dates d'époque ont été utilisées dans divers systèmes. L' heure POSIX / Unix est couramment utilisée , où l'époque est le premier moment de 1970 en UTC. Mais vous ne devez pas assumer cette époque.
- Quelle précision?
Parlons-nous des secondes, des millisecondes , des microsecondes ou des nanosecondes depuis l'époque?
- Quel fuseau horaire?
Habituellement, un décompte depuis l'époque est dans le fuseau horaire UTC / GMT, c'est-à-dire qu'il n'a aucun décalage de fuseau horaire. Mais parfois, lorsqu'il s'agit de programmeurs inexpérimentés ou ignorants de la date-heure, il peut y avoir un fuseau horaire implicite.
Dans votre cas, comme d'autres l'ont noté, vous semblez avoir eu quelques secondes depuis l'époque Unix. Mais vous passez ces secondes à un constructeur qui attend des millisecondes. La solution est donc de multiplier par 1000.
Leçons apprises:
- Déterminez, ne supposez pas, la signification des données reçues.
- Lisez le doc .
Vos données
Vos données semblent être en secondes entières. Si nous supposons une époque du début de 1970, et si nous supposons le fuseau horaire UTC, alors 1,220,227,200
c'est le premier moment du premier jour de septembre 2008.
Joda-Time
Les classes java.util.Date et .Calendar fournies avec Java sont notoirement gênantes. Évite-les. Utilisez à la place soit la bibliothèque Joda-Time , soit le nouveau package java.time intégré à Java 8 (et inspiré de Joda-Time).
Notez que contrairement à juDate, un DateTime
dans Joda-Time connaît vraiment son propre fuseau horaire attribué . Donc, dans l'exemple de code Joda-Time 2.4 vu ci-dessous, notez que nous analysons d'abord les millisecondes en utilisant l'hypothèse par défaut de UTC. Ensuite, deuxièmement, nous attribuons un fuseau horaire de Paris à ajuster. Même moment dans la chronologie de l'Univers, mais heure d'horloge murale différente . Pour la démonstration, nous nous ajustons à nouveau, à UTC. Il est presque toujours préférable de spécifier explicitement votre fuseau horaire souhaité / attendu plutôt que de compter sur une valeur implicite par défaut (souvent la cause de problèmes dans le travail de date-heure).
Nous avons besoin de millisecondes pour construire un DateTime. Alors, prenez votre saisie de secondes et multipliez par mille. Notez que le résultat doit être un 64 bits long
car nous déborderions d'un 32 bits int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
Envoyez ce nombre de millisecondes au constructeur. Ce constructeur particulier suppose que le décompte date de l'époque Unix de 1970. Ajustez donc le fuseau horaire comme vous le souhaitez, après la construction.
Utilisez des noms de fuseaux horaires appropriés , une combinaison de continent et de ville / région. N'utilisez jamais de codes à 3 ou 4 lettres tels EST
qu'ils ne sont ni normalisés ni uniques.
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Pour une démonstration, ajustez à nouveau le fuseau horaire.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Dump dans la console. Notez à quel point la date est différente à Montréal, car la nouvelle journée a commencé en Europe mais pas encore en Amérique.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
Lorsqu'il est exécuté.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Les créateurs de Joda-Time nous ont demandé de migrer vers son remplaçant, le framework java.time dès que possible. Bien que Joda-Time continue d'être activement pris en charge, tous les développements futurs seront effectués sur les classes java.time et leurs extensions dans le projet ThreeTen-Extra.
Le framework java-time est défini par JSR 310 et intégré à Java 8 et versions ultérieures. Les classes java.time ont été rétroportées vers Java 6 & 7 sur le projet ThreeTen-Backport et vers Android dans le projet ThreeTenABP .
An Instant
est un moment sur la chronologie en UTC avec une résolution de nanosecondes. Son époque est le premier moment de 1970 à UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Appliquez un offset-from-UTC ZoneOffset
pour obtenir un OffsetDateTime
.
Mieux encore, s'il est connu, appliquez un fuseau horaire ZoneId
pour obtenir un fichier ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );