Je crée une application pour Android dans Android Studio avec Java. Je travaille avec des dates et des heures. J'essaie de produire un horodatage Unix à partir d'un moment donné personnalisé. À titre d'exemple, le morceau de code suivant
LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30); ZoneId zoneId = ZoneId.systemDefault(); int x = Math.toIntExact(aDateTime.atZone(zoneId).toEpochSecond());
produit un horodatage Unix 1619760600. Cependant, lorsque j'entre ceci dans un convertisseur en ligne, il produit une heure de 30/04/2021 À 5h30 (UTC) . Ceci est décalé de 3 heures à partir de l'heure insérée d'origine, qui est le montant exact en heures pendant lequel mon fuseau horaire diffère de UTC00:00.
Le problème semble être mon incapacité à comprendre les fuseaux horaires en Java. Ma question est donc la suivante: comment prendre en compte correctement le fuseau horaire pour qu'un UnixTimeStamp correct soit produit?
3 Réponses :
Vous pouvez profiter de l'API java.time (en supposant que vous utilisez Java 8). Voici un exemple, en prenant les informations que vous avez fournies:
LocalDateTime localDateTime = LocalDateTime.of(2021, 4, 30, 8, 30); ZonedDateTime zdt = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()); long millis = zdt.toInstant().toEpochMilli();
Vous pouvez trouver plus d'informations ici . J'espère que ça aide
Procédez comme suit:
1619771400
Sortie:
import java.time.LocalDateTime;
import java.time.ZoneId;
public class Main {
public static void main(String[] args) {
LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30);
ZoneId zoneIdUTC = ZoneId.of("UTC");
ZoneId myZoneId = ZoneId.systemDefault();
LocalDateTime bDateTime = aDateTime.atZone(zoneIdUTC).withZoneSameInstant(myZoneId).toLocalDateTime();
System.out.println(bDateTime.atZone(myZoneId).toEpochSecond());
}
}
Essayez-le à https://www.unixtimestamp.com/index.php
Vous avez déjà le bon horodatage.
Les horodatages représentent des instants de temps. Les fuseaux horaires n'ont d'importance que lorsque vous souhaitez afficher un horodatage à l'heure locale d'un utilisateur. Dans votre cas, 30/04/2021 à 5h30 (UTC) correspond au même instant que 8h30 à votre heure locale. Vérifiez si l'outil en ligne que vous avez trouvé peut afficher l'horodatage dans votre heure locale en plus de l'heure UTC.
Vous devriez arrêter d'utiliser int pour l'horodatage et utiliser long à la place https://en.m.wikipedia.org/wiki/Year_2038_problem
Si vous pensiez créer un horodatage pour 8h30 UTC au lieu de 8h30 heure locale, utilisez simplement le fuseau horaire UTC lors de la création de datetime zoné:
LocalDateTime aDateTime = LocalDateTime.of(2021, 4, 30, 8, 30); ZoneId zoneId = ZoneOffset.UTC; long x = aDateTime.atZone(zoneId).toEpochSecond();