Java: date de l’horodatage unix

Je dois convertir un horodatage unix en object 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’ai eu par PHP) mais au lieu de cela je reçois le Thu Jan 15 23:11:56 IRST 1970 .

Comment devrait-il être fait?

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

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

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

De la documentation :

Alloue un object 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.

C’est le bon chemin:

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

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 utiliser:

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

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

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 serait imprimée 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’parsingr comme un long: Long.parseLong (horodatage).

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

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 aux versions ultérieures est le successeur de Joda-Time.

Ces nouvelles classes incluent une méthode d’usine pratique pour convertir un nombre entier de secondes à partir de l’époque. Vous obtenez un Instant , un moment sur la ligne de temps en UTC avec une résolution allant jusqu’à nanosecondes.

 Instant instant = Instant.ofEpochSecond( 1_280_512_800L ); 

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

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

Asia/Tehran horaires Asia/Kabul ou Asia/Tehran ?

Vous avez indiqué avoir obtenu une valeur de 22h30 au lieu des 18h00 affichées ici. Je soupçonne que votre utilitaire PHP applique implicitement un fuseau horaire par défaut pour s’ajuster à partir de l’heure UTC. Ma valeur ici est UTC, signifiée par le Z (abréviation de Zulu , UTC). Avez-vous une chance que votre OS ou PHP soit réglé sur les fuseaux horaires Asia/Kabul ou Asia/Tehran ? Je suppose que vous signalez l’ IRST dans votre production, ce qui signifie apparemment l’heure iranienne. Actuellement, en 2017, ce sont les seules zones fonctionnant avec une heure d’été à quatre heures et demie de l’heure UTC.

Spécifiez un nom de fuseau horaire approprié dans le format de 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 car elles ne sont pas de véritables fuseaux horaires, non normalisées et même uniques (!).

Si vous voulez voir votre moment à travers le fuseau horaire d’une région particulière, appliquez un ZoneId pour obtenir un ZonedDateTime . Toujours le même moment simultané, mais vu comme une heure d’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 devez 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 , l’équipe conseillant la migration vers les classes java.time .

FYI, le constructeur d’un DateTime Joda-Time 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, qui posent problème. 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 anciennes classes de date / heure héritées telles que java.util.Date , Calendar et SimpleDateFormat .

Le projet Joda-Time , maintenant 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 objects java.time directement avec votre firebase database. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de classes java.sql.* .

Où obtenir les classes java.time?

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré
    • Partie de l’API Java standard avec une implémentation intégrée.
    • 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 transférée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Versions ultérieures des implémentations de bundles Android des classes java.time.
    • Pour Android antérieur (<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 d’éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter , etc.

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

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 utilisez des fuseaux horaires EST ou UTC.

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

  TimeZone.setDefault(TimeZone.getTimeZone("UTC")); java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000)); 
 Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());