web-dev-qa-db-fra.com

Convertir les secondes Epoch au format de date et d'heure en Java

J'ai des secondes depuis le 1er janvier 1970 UTC (Epoch time).

 1320105600 

J'ai besoin de convertir ces secondes en date et heure dans le format ci-dessous.

 Vendredi 4 novembre 2011 5 h 00 

Comment puis-je atteindre cet objectif?

21
androiduser

Si vous êtes limité aux anciennes API Java.util.Date Et Java.util.Calendar, Vous devez tenir compte du fait que les horodatages sont interprétés en millisecondes, et non en secondes. Vous devez donc d'abord le multiplier par 1000 pour obtenir l'horodatage en millisecondes.

long seconds = 1320105600;
long millis = seconds * 1000;

De cette façon, vous pouvez le fournir à a.o. le constructeur de Java.util.Date et enfin utiliser SimpleDateFormat pour convertir un Java.util.Date en Java.lang.String dans le modèle de format de date souhaité, si nécessaire avec un fuseau horaire prédéfini (sinon il utiliserait le système fuseau horaire par défaut , qui n'est pas GMT/UTC en soi et donc l'heure formatée peut être désactivée).

Date date = new Date(millis);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedDate = sdf.format(date);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM

Dans le cas où vous êtes déjà sur Java8, il y a un LocalDateTime#ofEpochSecond() qui vous permet de nourrir Epoch secondes directement sans avoir besoin de multiplier en millisecondes.

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE,MMMM d,yyyy h:mm,a", Locale.ENGLISH);
String formattedDate = dateTime.format(formatter);
System.out.println(formattedDate); // Tuesday,November 1,2011 12:00,AM
32
BalusC
long yourSeconds = 1320105600L;
Date d = new Date(yourSeconds * 1000);

Voir ceci javadoc pour plus d'informations. Le constructeur a besoin de millisecondes.

Pour afficher cette date dans un format approprié, vous devez cocher DateFormat

Voici un exemple:

DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm:ss zzz");
System.out.println(df.format(date));
12
lukastymo

Java.time

Le Answer by BalusC est bon en ce qu'il vous indique l'utilisation de Java.time. Mais cette réponse utilise LocalDateTimeInstant est plus approprié. Un LocalDateTime n'est pas un moment sur la chronologie car il n'a délibérément aucun concept de offset-from-UTC ou fuseau horaire .

Java.time

Le framework Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure gênantes telles que Java.util.Date, .Calendar, & Java.text.SimpleDateFormat. L'équipe Joda-Time conseille également la migration vers Java.time.

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité Java.time est back-portée vers Java 6 & 7 in ThreeTen-Backport et encore adaptée à Android dans ThreeTenABP .

Instant

Un moment sur la timeline dans UTC avec une résolution jusqu'à nanosecondes est représenté par le Instant classe.

Instant instant = Instant.ofEpochSecond ( 1_320_105_600L );

Dump sur console. Votre valeur d'entrée est le premier moment du 1er novembre 2011 dans UTC . Le Z à la fin, abréviation de 'Zulu', signifie UTC.

System.out.println ( "instant: " + instant );

instant: 2011-11-01T00: 00: 00Z

ZonedDateTime

Dans vos commentaires, vous mentionnez vouloir voir cette date-heure à travers l'objectif de la America/Chicago fuseau horaire. Utilisez un nom de fuseau horaire correct . Appliquez un fuseau horaire, ZoneId, pour obtenir un objet ZonedDateTime. On voit que Chicago a cinq heures de retard sur UTC à cette date.

ZoneId zoneId = ZoneId.of ( "America/Chicago" );
ZonedDateTime zdt = instant.atZone ( zoneId );

zdt: 2011-10-31T19: 00-05: 00 [Amérique/Chicago]

Cordes

Les chaînes vues ci-dessus sont au format standard ISO 8601 . Pour générer des chaînes dans d'autres formats, utilisez la classe DateTimeFormatter . Vous pouvez spécifier votre propre modèle personnalisé. Mais il est généralement préférable de laisser Java.time se localiser automatiquement au langage humain et aux normes culturelles encodées dans un objet Locale .

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL );
formatter = formatter.withLocale ( Locale.US );
String output = zdt.format ( formatter );

Lundi 31 octobre 2011 7:00:00 PM CDT

Pour spécifier votre propre format personnalisé, recherchez Stack Overflow pour de nombreux exemples et plus de discussion.

6
Basil Bourque
int seconds = 1320105600;
Date date = new Date(seconds * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("EEEE,MMMM d,yyyy h:mm,a");
System.out.println(sdf.format(date));
2
Eng.Fouad

L'astuce consiste à utiliser Java.util.Date et Java.text.DateFormat pour obtenir le format souhaité. Vous pouvez voir comment le faire dans tutoriels sur le Web .

0
Malcolm