J'ai des millisecondes dans certains fichiers journaux générés sur le serveur, je connais également les paramètres régionaux à partir desquels 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 se déroule sur un serveur situé dans un fuseau horaire différent. Lors de la conversion au programme "SimpleDateFormat", la date de la machine est prise en compte car une telle date formatée ne représente pas l'heure correcte du serveur. Y a-t-il un moyen de gérer cela avec élégance?
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));
Production:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
GregorianCalendar
,SimpleDateFormat
, etc.) et l'excellente bibliothèque Joda-Time sont désormais supplantés par les modernes java.time classes.Réponses:
la source
final Calendar calendar = Calendar.getInstance();
1515436200000l
, je devienscalendar.get(Calendar.MONTH))
comme0
!java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .Vous pouvez utiliser la
java.util.Date
classe et ensuite utiliserSimpleDateFormat
pour formater le fichierDate
.Nous pouvons utiliser le package java.time (tutoriel) - API DateTime introduites dans Java SE 8.
// Format the date
la source
java.util.Date
sont pas amorties. (Il y a des API de date et d'heure améliorées dans JDK8java.time
)java.util.Date
,java.util.Calendar
etjava.text.SimpleDateFormat
sont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .tl; dr
Détails
Les autres réponses utilisent des classes obsolètes ou incorrectes.
Évitez les anciennes classes date-heure telles que java.util.Date/.Calendar. Ils se sont avérés mal conçus, déroutants et gênants.
java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Une grande partie des fonctionnalités est rétroportée vers Java 6 et 7 et adaptée à Android . Fabriqué par les mêmes personnes que Joda-Time .
An
Instant
est un moment sur la chronologie en UTC avec une résolution de nanosecondes . Son époque est le premier moment de 1970 en UTC.En supposant que vos données d'entrée sont un nombre de millisecondes de 1970-01-01T00: 00: 00Z (pas clair dans la question), alors nous pouvons facilement instancier un fichier
Instant
.La chaîne au format ISO 8601
Z
dans cette norme est l'abréviation de et signifie UTCZulu
.Appliquez un fuseau horaire en utilisant un nom de fuseau horaire approprié pour obtenir un fichier
ZonedDateTime
.Voir ce code exécuté en direct sur IdeOne.com .
Asia/Kolkata
fuseau horaire ?Je suppose que vous avez un fuseau horaire en Inde affectant votre code. Nous voyons ici que l'ajustement au
Asia/Kolkata
fuseau horaire restitue la même heure de la journée que celle que vous signalez,08:55
soit cinq heures et demie d'avance sur notre valeur UTC03:25
.Zone par défaut
Vous pouvez appliquer le fuseau horaire par défaut actuel de la JVM. Attention, la valeur par défaut peut changer à tout moment pendant l'exécution . Tout code dans n'importe quel thread de n'importe quelle application dans la JVM peut changer la valeur par défaut actuelle. Si important, demandez à l'utilisateur le fuseau horaire souhaité / attendu.
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais 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 .
Avec un pilote JDBC conforme à JDBC 4.2 ou supérieur, vous pouvez échanger des objets java.time directement avec votre base de données. Pas besoin de chaînes ou de classes java.sql. *.
Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
ZoneId.systemDefault()
. Voir la nouvelle section ajoutée à la fin de ma réponse.Le moyen le plus simple de le faire est d'utiliser la classe Joda DateTime et de spécifier à la fois l'horodatage en millisecondes et la DateTimeZone souhaitée.
Je recommande vivement d'éviter les classes Java Date et Calendar intégrées; ils sont terribles.
la source
Si la valeur en millis est le nombre de millis depuis le 1er janvier 1970 GMT, comme c'est le cas pour la JVM, cela est indépendant du fuseau horaire. Si vous souhaitez le formater avec un fuseau horaire spécifique, vous pouvez simplement le convertir en objet GregorianCalendar et définir le fuseau horaire. Après cela, il existe de nombreuses façons de le formater.
la source
Ma solution
la source
Je fais ça comme ça:
Vous pouvez également utiliser
getDateInstance(int style)
avec les paramètres suivants:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
la source
La classe SimpleDateFormat a une méthode appelée SetTimeZone (TimeZone) qui est héritée de la classe DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
la source
Moyen le plus simple:
la source
Voici ma solution pour obtenir la date du millisecondes au format de date. Vous devez utiliser la bibliothèque Joda pour exécuter ce code.
la source
Vous pouvez essayer java.time api;
la source