J'ai des millisecondes dans un certain fichier journal généré par le serveur, je connais également la locale d'où le fichier journal a été généré, mon problème est de convertir les millisecondes en date dans le format spécifié. Le traitement de ce journal est effectué sur un serveur situé dans un fuseau horaire différent. Lors de la conversion au format SimpleDateFormat, le programme prend la date de la machine et la date ainsi formatée ne représente pas l'heure correcte du serveur. Existe-t-il un moyen de gérer cela de manière élégante ?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
Sortie :
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
Vous pouvez utiliser la classe java.util.Date
et ensuite utiliser SimpleDateFormat
pour formater la Date
.
Date date=new Date(millis);
Nous pouvons utiliser le paquet [java.time][1] (tutoriel) - APIs DateTime introduites dans le Java SE 8.
var instance = java.time.Instant.ofEpochMilli(millis);
var localDateTime = java.time.LocalDateTime
.ofInstant(instance, java.time.ZoneId.of("Asia/Kolkata"));
var zonedDateTime = java.time.ZonedDateTime
.ofInstant(instance,java.time.ZoneId.of("Asia/Kolkata"));
// Formatage de la date
var formatter = java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);
[1] : https://docs.oracle.com/javase/tutorial/datetime/index.html
Si la valeur millis est le nombre de millis depuis le 1er janvier 1970 GMT, comme c'est la norme pour la JVM, alors cela est indépendant du fuseau horaire. Si vous voulez le formater avec un fuseau horaire spécifique, vous pouvez simplement le convertir en un objet GregorianCalendar et définir le fuseau horaire. Après cela, il existe de nombreuses façons de le formater.
La façon la plus simple de procéder est d'utiliser la [classe Joda DateTime][1] et de spécifier à la fois l'horodatage en millisecondes et la DateTimeZone souhaitée.
Je vous recommande vivement d’éviter les classes de date et de calendrier intégrées de Java ; elles sont terribles.
[1] : http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html