J'ai une liste avec de longues valeurs (par exemple: 1220227200, 1220832000, 1221436800 ...) que j'ai téléchargées à partir du service Web. Je dois le convertir en dates. Malheureusement de cette façon, par exemple:
Date d = new Date(1220227200);
renvoie le 1er janvier 1970. Quelqu'un connaît-il une autre façon de le convertir correctement?
java
date
long-integer
mmmiki
la source
la source
java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures.Réponses:
Le
Date
constructeur (cliquez sur le lien!) Accepte le tempslong
en millisecondes et non en secondes. Vous devez le multiplier par 1000 et vous assurer de le fournir en tant quelong
.Cela montre ici
la source
Date d = new Date(TimeUnit.SECONDS.toMillis(1220227200L));
pour une solution plus propre et moins magique .tl; dr
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:
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.
Parlons-nous des secondes, des millisecondes , des microsecondes ou des nanosecondes depuis l'époque?
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:
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 bitsint
.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.Pour une démonstration, ajustez à nouveau le fuseau horaire.
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.
Lorsqu'il est exécuté.
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.Appliquez un offset-from-UTC
ZoneOffset
pour obtenir unOffsetDateTime
.Mieux encore, s'il est connu, appliquez un fuseau horaire
ZoneId
pour obtenir un fichierZonedDateTime
.la source
Il semble que vos longs soient des secondes et non des millisecondes. Le constructeur de date prend le temps en millisecondes, donc
la source
Définir uniquement l'heure en moulins sur l'objet Calendrier
la source
Ce sont probablement des horodatages en secondes et non en millisecondes, ce qui est requis pour le constructeur java new Date (long). Multipliez-les simplement par 1000 et vous devriez être bien.
la source
Les valeurs longues correspondent très probablement aux horodatages d' époque et les valeurs sont:
1220227200 = lun, 01 sept. 2008 00:00:00 GMT
1220832000 = lun, 08 sept. 2008 00:00:00 GMT
1221436800 = Lun, 15 septembre 2008 00:00:00 GMT
On peut convertir ces valeurs longues en java.util.Date , en tenant compte du fait que java.util.Date utilise des millisecondes - comme indiqué précédemment, mais avec quelques défauts - comme ceci:
Maintenant, pour afficher correctement la date, on peut utiliser java.text.DateFormat comme illustré ci-après:
Voici les résultats de l'affichage de la valeur longue convertie en java.util.Date sans utiliser ni utiliser le DateFormat:
la source
Essaye ça:
la source
1220227200 correspond au 15 janvier 1980 (et en effet la nouvelle Date (1220227200) .toString () renvoie "Thu Jan 15 03:57:07 CET 1970"). Si vous passez une valeur longue à une date, c'est-à-dire avant le 01/01/1970, elle renverra en fait une date du 01/01/1970. Assurez-vous que vos valeurs ne sont pas dans cette situation (inférieures à 82800000).
la source
Essayez ceci en ajustant le format de la date.
Remarque: Vérifiez pendant un cycle de 24 heures ou 12 heures.
la source
Nouvelle date (nombre) renvoie une date en
number
millisecondes après le 1er janvier 1970. Il est probable que le format de la date n'indique pas les heures, les minutes et les secondes pour que vous puissiez voir que c'est juste un peu après le 1er janvier 1970.Vous devez analyser la date en fonction du routage d'analyse correct. Je ne sais pas ce qu'est un 1220227200, mais s'il s'agit de secondes après le 1 janvier 1970, multipliez-le pour obtenir des millisecondes. Si ce n'est pas le cas, convertissez-le d'une manière ou d'une autre en millisecondes après 1970 (si vous souhaitez continuer à utiliser java.util.Date).
la source
Travaille pour moi. Vous voudrez probablement le multiplier par 1000, car ce que vous obtenez sont les secondes de 1970 et vous devez passer les millisecondes à partir du 1er janvier 1970
la source