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?
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.
C'est la bonne façon:
Date date = new Date ();
date.setTime((long)unix_time*1000);
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
.
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
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?
- Java SE 8 , Java SE 9 , et plus tard
- Built-in.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et Java SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
- versions ultérieures des implémentations du paquet Android de java.les classes de temps.
- Pour plus tôt Android (<26 ans), le ThreeTenABP "1519440920 projet" s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir comment utiliser ThreeTenABP... .
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 .
Date du constructeur attend l'horodatage valeur en millisecondes. Multipliez la valeur de votre horodatage par 1000, puis passez est au constructeur.
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));
Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());