web-dev-qa-db-fra.com

Java: date de l'horodatage unix

J'ai besoin de convertir un horodatage Unix en un objet de 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 en PHP) mais je reçois plutôt Thu Jan 15 23:11:56 IRST 1970.

Comment devrait-il être fait?

223
RYN

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 quelques millisecondes, alors simplement new Java.util.Date((long)timeStamp);

De la documentation :

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

406
Pablo Santa Cruz

Java.time

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

Avec Java.time, vous pouvez utiliser:

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

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

50
micha

C'est le bon chemin:

Date date = new Date ();
date.setTime((long)unix_time*1000);
43
Marco Fantasia

On dirait que le calendrier est la nouvelle façon de faire:

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 d'utilisation, celle-ci affichera 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 en tant que long: Long.parseLong (horodatage).

https://docs.Oracle.com/javase/7/docs/api/Java/util/Calendar.html

25
Stefan

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 pratique permettant de convertir un nombre de secondes entières de Epoch. Vous obtenez un Instant, un moment sur la ligne de temps au format UTC avec une résolution pouvant atteindre les nanosecondes.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

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

Voir que code exécuté en direct sur IdeOne.com .

Asia/Kabul ou Asia/Tehran fuseaux horaires?

Vous avez indiqué avoir une valeur de l'heure de la journée de 22h30 au lieu de 18h00 affichée ici. Je soupçonne que votre utilitaire PHP applique implicitement un fuseau horaire par défaut pour l'ajustement à partir de l'UTC. Ma valeur ici est UTC, indiquée par Z (pour Zulu, signifie UTC). Le système d'exploitation de votre machine ou PHP est-il configuré sur Asia/Kabul ou Asia/Tehran fuseaux horaires? Je suppose que oui, lorsque vous indiquez IRST dans votre document, ce qui signifie apparemment l'heure iranienne. Actuellement en 2017, ce sont les seules zones fonctionnant avec une heure d'été en avance de quatre heures et demie sur l'UTC.

Spécifiez un nom du fuseau horaire } au format continent/region, tel que America/Montreal , Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais les abréviations de 3-4 lettres telles que EST ou IST ou IRST telles qu'elles sont not vrais fuseaux horaires, non normalisés et même non uniques (!).

Si voulez pour voir votre moment à travers l'objectif du fuseau horaire d'une région particulière, appliquez un ZoneId pour obtenir un ZonedDateTime . Toujours le même moment simultané, mais vu comme un heure de l'horloge différent.

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

UPDATE: Le projet Joda-Time est maintenant en mode maintenance , avec l'équipe conseillant la migration vers les classes Java.time .

FYI, le constructeur pour 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 est préférable d'éviter les classes Java.util.Date et .Calendar notoirement pénibles. 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 cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers les classes Java.time .

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

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

Où obtenir les classes Java.time?

  • Java SE 8 _, Java SE 9 , et plus tard
    • Intégré.
    • Partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée sur Java 6 & 7 dans ThreeTen-Backport .
  • Android
    • Les versions ultérieures de Android regroupent des implémentations des classes Java.time.
    • Pour les versions antérieures de Android (<26), le projet ThreeTenABP s'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 d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

22
Basil Bourque

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

11
f1sh

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

Les descriptions ci-dessus entraîneront des valeurs de date différentes si vous utilisez 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
tmr