Java: date de l'horodatage Unix

237

J'ai besoin de convertir un horodatage Unix en un objet date.
J'ai essayé ceci:

java.util.Date time = new java.util.Date(timeStamp);

La valeur d'horodatage est: 1280512800

La date devrait être "2010/07/30 - 22:30:00" (comme je l'obtiens par PHP), mais à la place, j'obtiens Thu Jan 15 23:11:56 IRST 1970.

Comment faut-il procéder?

RYN
la source
3
Si vous utilisez Java 8 ou une version plus récente: jetez un œil à cette réponse: stackoverflow.com/a/24703644/1115554
micha
1
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Datemaintenant sont héritées , supplantées par les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque

Réponses:

429

Pour 1280512800, multipliez par 1000, car java attend des millisecondes:

java.util.Date time=new java.util.Date((long)timeStamp*1000);

Si vous avez déjà eu des millisecondes, alors new java.util.Date((long)timeStamp);

De la documentation :

Alloue un objet Date et l'initialise pour représenter le nombre spécifié de millisecondes depuis l'heure de base standard appelée "l'époque", à savoir le 1er janvier 1970, 00:00:00 GMT.

Pablo Santa Cruz
la source
41
Le transtypage en (long)est très important: sans lui l'entier déborde.
mneri
2
@TomasK java.util.Dateest le nom complet de la classe. Dateest probablement la même chose à condition que vous importiez le java.utilpackage sur votre classe.
Pablo Santa Cruz
5
Le casting trop long n'est pas nécessaire. time = new java.util.Date (timeStamp * 1000L) fonctionne aussi bien (puisque 1000L est un long, l'horodatage sera remonté bien avant la multiplication)
Tony BenBrahim
2
Personnellement, je ferais:Date time = new Date(TimeUnit.MILLISECONDS.convert(unixTimestamp, TimeUnit.SECONDS));
Ryan Amaral
3
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Datemaintenant sont héritées , supplantées par les classes java.time . Voir Tutoriel par Oracle .
Basil Bourque
60

java.time

Java 8 a introduit une nouvelle API pour travailler avec les dates et les heures: le package java.time .

Avec java.time, vous pouvez analyser votre compte de secondes entières depuis la référence de l'époque du premier moment de 1970 en UTC, 1970-01-01T00: 00Z. Le résultat est un Instant.

Instant instant = Instant.ofEpochSecond( timeStamp );

Si vous avez besoin d'un java.util.Datepour interagir avec l'ancien code non encore mis à jour pour java.time , convertissez. Appelez de nouvelles méthodes de conversion ajoutées aux anciennes classes.

Date date = Date.from( instant );
micha
la source
3
Bien que cette réponse soit correcte sur le plan technique, notez que les classes java.time supplantent les anciennes classes de date-heure gênantes telles que java.util.Date. Les anciennes classes sont héritées et doivent être évitées. Bien que vous puissiez en effet convertir vers / à partir des classes héritées et java.time, il est préférable de s'en tenir à java.time chaque fois que possible.
Basil Bourque
44

C'est le bon chemin:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Marco Fantasia
la source
27

On dirait que le calendrier est la nouvelle façon de procéder:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

La dernière ligne n'est qu'un exemple d'utilisation, celle-ci afficherait par exemple "14.06.2012".

Si vous avez utilisé System.currentTimeMillis () pour enregistrer l'horodatage, vous n'avez pas besoin de la partie "* 1000".

Si vous avez l'horodatage dans une chaîne, vous devez d'abord l'analyser comme un long: Long.parseLong (horodatage).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

Stefan
la source
8
Attention: si timestampest un entier, vous devez d' (long)abord le convertir, sinon vous vous retrouverez avec des dates erronées. mydate.setTimeInMillis((long) timestamp*1000);
svenkapudija
J'ai corrigé le lien.
Ricbit
Pour info, les anciennes classes de date-heure gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque
26

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00: 00Z

java.time

Le nouveau framework java.time intégré à Java 8 et versions ultérieures est le successeur de Joda-Time.

Ces nouvelles classes incluent une méthode d'usine pratique pour convertir un nombre de secondes entières de l'époque. Vous obtenez un Instant, un moment sur la chronologie en UTC avec une résolution allant jusqu'à nanosecondes.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010-07-30T18: 00: 00Z

Découvrez ce code en direct sur IdeOne.com .

Tableau des types de date-heure en Java, à la fois modernes et hérités

Asia/Kabulou Asia/Tehranfuseaux horaires?

Vous avez indiqué avoir obtenu une valeur horaire de 22h30 au lieu de 18h00 ici. Je soupçonne que votre utilitaire PHP applique implicitement un fuseau horaire par défaut pour s'ajuster à partir d'UTC. Ma valeur ici est UTC, signifiée par le Z(abréviation de Zulu, signifie UTC). Y a-t-il une chance que votre système d'exploitation ou PHP soit défini sur Asia/Kabulou sur les Asia/Tehranfuseaux horaires? Je suppose que oui comme vous le signalez IRSTdans votre sortie qui signifie apparemment l'heure de l'Iran. Actuellement, en 2017, ce sont les seules zones fonctionnant avec une heure d'été qui a quatre heures et demie d'avance sur UTC.

Indiquez un nom de fuseau horaire approprié dans le format continent/region, tels que America/Montreal, Africa/Casablancaou Pacific/Auckland. N'utilisez jamais l'abréviation de 3-4 lettres telle que ESTou ISTou IRSTcar ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).

Si vous voulez voir votre moment à travers l'objectif du fuseau horaire d'une région particulière, appliquez a ZoneIdpour obtenir a ZonedDateTime. Toujours le même moment simultané, mais vu comme une horloge murale différente .

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010-07-30T22: 30 + 04: 30 [Asie / Téhéran]

Conversion de java.time en classes héritées

Vous devriez vous en tenir aux nouvelles classes java.time. Mais vous pouvez convertir en ancien si nécessaire.

java.util.Date date = java.util.Date.from( instant );

Joda-Time

MISE À JOUR: Le projet Joda-Time est maintenant en mode maintenance , l'équipe conseillant la migration vers les classes java.time .

Pour info, le constructeur d'un Joda-Time DateTime est similaire: Multipliez par mille pour produire un long(pas un int!).

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

Il vaut mieux éviter les classes java.util.Date et .Calendar particulièrement gênantes. Mais si vous devez utiliser une date, vous pouvez convertir à partir de Joda-Time.

java.util.Date date = dateTime.toDate();

À propos de java.time

Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que java.util.Date, Calendar, et SimpleDateFormat.

Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .

Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*cours.

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré.
    • Une partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et correctifs mineurs.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundles Android des classes java.time.
    • Pour les versions antérieures d'Android (<26), le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour de futurs ajouts possibles à java.time. Vous trouverez peut - être des classes utiles ici, comme Interval, YearWeek, YearQuarteret plus .

Basil Bourque
la source
11

Le constructeur de Date s'attend à ce que la valeur timeStamp soit en millisecondes. Multipliez la valeur de votre horodatage par 1000, puis passez au constructeur.

f1sh
la source
7

Si vous convertissez une valeur d'horodatage sur une autre machine, vous devez également vérifier le fuseau horaire de cette machine. Par exemple;

Les descriptions ci-dessus entraîneront des valeurs de date différentes, si vous exécutez avec des fuseaux horaires EST ou UTC.

Pour définir le fuseau horaire; aka UTC, vous pouvez simplement réécrire;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
tmr
la source
6
Je ne recommanderais pas cela car cela définit le fuseau horaire pour l'ensemble du jvm et pas seulement le processus d'analyse!
1

Pour kotlin

fun unixToDate(timeStamp: Long) : String? {
    val time = java.util.Date(timeStamp as Long * 1000)
    val sdf = SimpleDateFormat("yyyy-MM-dd")
    return sdf.format(time)

}
kzncrda
la source
0

Parfois, vous devez travailler avec des ajustements.

N'utilisez pas le casting trop longtemps! Utilisez le nanoadjustment.

Par exemple, en utilisant Oanda Java API pour le trading, vous pouvez obtenir datetime au format UNIX.

Par exemple: 1592523410.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
    System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

vous obtenez:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

Utiliser aussi:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );
Damir Isanbirdin
la source
-4
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
Masatsugu Hosoi
la source
3
Sans plus de texte, on ne sait pas pourquoi cette réponse est préférable aux nombreuses autres de cette question. Pouvez-vous clarifier s'il vous plait?
Duncan Jones
Cela modifiera la date plutôt que de la convertir!
backslashN