Java: Date à partir de timestamp unix

j'ai besoin de convertir un timestamp unix en objet date.

J'ai essayé ceci:

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

la valeur de L'horodatage est: 1280512800

la Date doit être "2010/07/30 - 22:30:00" (Comme je l'obtiens par PHP) mais à la place je reçois Thu Jan 15 23:11:56 IRST 1970 .

Comment faire?

203
demandé sur Eric Leschinski 2010-07-30 16:22:45

8 réponses

pour 1280512800 , multiplier par 1000, puisque java attend des millisecondes:

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

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

De la documentation :

attribue un objet Date et l'initialise pour représenter nombre spécifié de millisecondes depuis le temps de base standard connu sous le nom de " epoch", à savoir le 1er janvier 1970, 00:00:00 GMT.

380
répondu Pablo Santa Cruz 2017-11-30 19:30:00

C'est la bonne façon:

Date date = new Date ();
date.setTime((long)unix_time*1000);
42
répondu Marco Fantasia 2011-09-13 15:52:56

de java.temps

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

avec java.temps que vous pouvez utiliser:

Date date = Date.from( Instant.ofEpochSecond( timeStamp ) );

Un Instantanée représente un horodatage dans Java 8. Avec la méthode statique Date.from() vous pouvez convertir un Instant en une instance java.util.Date .

42
répondu micha 2014-07-11 20:12:32

on dirait que le calendrier est la nouvelle façon d'aller:

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 est juste un exemple de comment l'utiliser, ce serait d'imprimer par exemple "14.06.2012".

si vous avez utilisé System.currentTimeMillis () pour sauvegarder L'horodatage, vous n'avez pas besoin de la partie "*1000".

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

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

25
répondu Stefan 2015-04-12 15:55:35

tl; dr

Instant.ofEpochSecond( 1_280_512_800L )

2010-07-30T18: 00:00Z

de java.time

Le nouveau java.time framework intégré dans Java 8 et plus tard est le successeur de Joda-Time.

ces nouvelles classes comprennent 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 timeline en UTC avec jusqu'à nanosecondes résolution.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

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

voir IdeOne.com .

Asia/Kabul ou Asia/Tehran les fuseaux horaires ?

vous avez déclaré avoir une heure de la journée de 22: 30 au lieu de 18:00 ici. Je soupçonne votre utilitaire PHP d'appliquer implicitement un fuseau horaire par défaut à ajuster à partir de UTC. Ma valeur ici est UTC, signifiée par le Z (abréviation de Zulu , signifie UTC). Une chance que votre machine OS ou PHP soit réglé sur Asia/Kabul ou Asia/Tehran fuseaux horaires? Je suppose que c'est le cas alors que vous rapportez IRST dans votre sortie, ce qui signifie apparemment L'heure D'Iran. Actuellement en 2017 ce sont les seules zones fonctionnant avec une heure d'été qui est de quatre heures et demie d'avance de UTC.

spécifier un nom propre du fuseau horaire dans le format continent/region , tel que America/Montreal , Africa/Casablanca , ou Pacific/Auckland . N'utilisez jamais l'abréviation de 3-4 lettres comme EST ou IST ou IRST car ils sont pas vrai fuseaux horaires, non standardisé, et même pas unique(!).

Si vous veulent pour voir votre moment à travers la lentille d'une région particulière du fuseau horaire, appliquer un ZoneId pour obtenir un ZonedDateTime . Toujours le même moment simultané, mais vu sous un autre horloge murale .

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.le temps de l'héritage de classes

vous devriez vous en tenir au nouveau java.les classes de temps. Mais vous pouvez convertissez 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 le java.temps des classes.

FYI, le constructeur pour un Joda-Time DateTime est similaire: multiplier par mille pour produire un long (pas un int !).

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

mieux vaut éviter la fameuse java.util.La Date et l' .Calendrier des classes. Mais si vous devez utiliser une Date, vous pouvez convertir de Joda-Time.

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

à Propos de de java.heure

Le de java.time framework est construit dans Java 8 et plus tard. Ces classes supplanter le vieux gênant legacy les classes de date-heure telles que java.util.Date , Calendar , & SimpleDateFormat .

le Joda-Time projet, maintenant en mode maintenance , conseille la migration vers le java.temps des classes.

à pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .

vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un JDBC driver conforme à JDBC 4.2 ou plus tard. Pas besoin de Chaînes, pas besoin de classes java.sql.* .

où obtenir le java.les classes de temps?

ThreeTen-Extra " le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'expérimentation pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

18
répondu Basil Bourque 2018-04-02 00:28:58

Date du constructeur attend l'horodatage valeur en millisecondes. Multipliez la valeur de votre horodatage par 1000, puis passez est au constructeur.

11
répondu f1sh 2010-07-30 12:24:58

si vous convertissez une valeur de timestamp sur une autre machine, vous devriez également vérifier le fuseau horaire de cette machine. Par exemple:

les descriptions ci-dessus résulteront 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));
7
répondu tmr 2013-09-16 21:47:41
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
-2
répondu Masatsugu Hosoi 2015-03-19 05:21:29