Tl;dr
java.time.Instant // Représente un moment tel qu'il est vu en UTC. En interne, un comptage de nanosecondes depuis 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Passe un comptage de secondes entières depuis la même référence d'époque de 1970-01-01T00:00Z.
Connaissez Vos Données
Les gens utilisent diverses précisions pour suivre le temps en tant que nombre depuis une époque. Donc lorsque vous obtenez des nombres à interpréter comme un comptage depuis une époque, vous devez déterminer :
- Quelle époque?
De nombreuses époques ont été utilisées dans divers systèmes. Couramment utilisée est l'époque POSIX/Unix, où l'époque est le premier moment de 1970 en UTC. Mais vous ne devriez pas supposer cette époque.
- Quelle précision?
Parlons-nous de secondes, de millisecondes, de microsecondes ou de nanosecondes depuis l'époque?
- Quel fuseau horaire?
En général, un comptage depuis l'époque est enregistré dans le fuseau horaire UTC/GMT, c'est-à-dire, n'a aucun décalage de fuseau horaire du tout. Mais parfois, lorsqu'il s'agit de programmeurs inexpérimentés ou ignorants de la date et de l'heure, il peut y avoir un fuseau horaire implicite.
Dans votre cas, comme d'autres l'ont noté, il semble que vous ayez reçu des secondes depuis l'époque Unix. Mais vous passez ces secondes à un constructeur qui attend des millisecondes. La solution est donc de multiplier par 1 000.
Leçons apprises :
- Déterminez, ne supposez pas, la signification des données reçues.
- Lisez la documentation.
Vos Données
Vos données semblent être en secondes entières. Si nous supposons une époque au début de 1970, et si nous supposons le fuseau horaire UTC, alors 1 220 227 200
est le premier moment du premier jour de septembre 2008.
Joda-Time
Les classes java.util.Date et .Calendar fournies avec Java sont notoirement problématiques. Évitez-les. Utilisez plutôt la bibliothèque Joda-Time ou le nouveau package java.time inclus dans Java 8 (et inspiré par Joda-Time).
À noter que contrairement à j.u.Date, un DateTime
dans Joda-Time connaît vraiment son propre fuseau horaire attribué. Ainsi dans le code Joda-Time 2.4 vu ci-dessous en exemple, notez que nous parsions d'abord les millisecondes en utilisant l'hypothèse par défaut de l'UTC. Ensuite, deuxièmement, nous attribuons un fuseau horaire de Paris pour ajuster. Même moment dans la chronologie de l'Univers, mais différente heure affichée. Pour une démonstration, nous ajustons de nouveau, vers UTC. Il est presque toujours préférable de spécifier explicitement votre fuseau horaire désiré/attendu plutôt que de se fier à un paramètre par défaut implicite (souvent à l'origine des problèmes dans le travail sur les dates et heures).
Nous avons besoin de millisecondes pour construire un DateTime. Donc prenez votre entrée de secondes, et multipliez par mille. Notez que le résultat doit être un entier long de 64 bits long
car nous aurions un dépassement d'un entier de 32 bits int
.
long entrée = 1 220 227 200L; // Notez le "L" ajouté aux littéraux entiers longs.
long millisecondes = ( entrée * 1 000L ); // Utilisez un "long", pas l'habituel "int". Notez le "L" ajouté.
Alimentez ce comptage de millisecondes au constructeur. Ce constructeur particulier suppose que le comptage est depuis l'époque Unix de 1970. Donc ajustez le fuseau horaire selon vos besoins, après la construction.
Utilisez les noms de bons fuseaux horaires, une combinaison de continent et ville/région. Ne jamais utiliser des codes à 3 ou 4 lettres comme EST
car ils ne sont ni normalisés ni uniques.
DateTime dateTimeParis = new DateTime( millisecondes ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
Pour une démonstration, ajustez de nouveau le fuseau horaire.
DateTime dateTimeUTC = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
Impression sur la console. Notez comment la date est différente à Montréal, car le nouveau jour 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 );
À l'exécution.
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 remplacement, le cadre java.time dès que cela est pratique. Bien que Joda-Time continue d'être activement soutenu, tout développement futur se fera sur les classes java.time et leurs extensions dans le projet ThreeTen-Extra.
Le cadre java-time est défini par le JSR 310 et intégré dans Java 8 et ultérieur. 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.
Un Instant
est un moment sur la ligne de temps en UTC avec une résolution de nanosecondes. Son époque est le premier moment de 1970 en UTC.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
Appliquez un décalage par rapport à l'UTC à un ZoneOffset
pour obtenir un OffsetDateTime
.
Mieux encore, si vous le savez, appliquez un ZoneId
de fuseau horaire pour obtenir un ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
0 votes
Pourriez-vous dire quelles valeurs vous attendez? La question des secondes/milliseconds peut être valide, mais 1220227200 n'est pas le 1/1/1970. Il semble que vous passiez 0 au constructeur. Un peu plus de code pourrait aider.
1 votes
@mmmiki - vous devriez accepter une réponse
0 votes
Il renvoie le 15 janv. 1970, ici, et non le 1er janv.
0 votes
FYI, les classes date-heure tellement déficientes telles que
java.util.Date
,java.util.Calendar
, etjava.text.SimpleDateFormat
sont désormais obsolètes, remplacées par les classes java.time intégrées dans Java 8 et ultérieur.