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 à ce jour dans le format spécifié. Le traitement de ce journal a lieu sur un serveur situé dans un fuseau horaire différent. Lors de la conversion en "SimpleDateFormat", le programme prend la date de la machine, car cette date formatée ne représente pas l'heure correcte du serveur. Est-il possible 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));
Sortie:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
Vous pouvez utiliser Java.util.Date
class puis utiliser SimpleDateFormat
pour formater le Date
.
Date date=new Date(millis);
Nous pouvons utiliser le package Java.time (tutoriel) - API 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"));
// Format the date
var formatter = Java.time.format.DateTimeFormatter.ofPattern("u-M-d hh:mm:ss a O");
var string = zonedDateTime.format(formatter);
_Instant.ofEpochMilli( 1_322_018_752_992L ) // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.
_
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.
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Une grande partie de la fonctionnalité est rétroportée sur Java 6 & 7 et plus loin adaptée à Android . Fabriqué par quelques-uns des mêmes personnes que Joda-Time .
Un Instant
est un moment sur la timeline de UTC avec une résolution de nanosecondes . Son Epoch est le premier moment de 1970 en UTC.
En supposant que vos données d'entrée correspondent à un nombre de millisecondes de 1970-01-01T00: 00: 00Z (pas clairement dans la question), nous pouvons facilement instancier un Instant
.
_Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );
_
instant.toString (): 2011-11-23T03: 25: 52.992Z
La chaîne Z
dans cette norme ISO 8601 est l'abréviation de Zulu
et signifie UTC .
Appliquez un fuseau horaire à l'aide de nom du fuseau horaire approprié , pour obtenir un ZonedDateTime
.
_ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );
_
Voir ceci code exécuté en direct à IdeOne.com .
Asia/Kolkata
_ fuseau horaire?Je suppose que vous avez un fuseau horaire indien qui affecte votre code. Nous voyons ici que l'ajustement dans Asia/Kolkata
indique le même heure que vous signalez, _08:55
_, soit cinq heures et demie d'avance sur notre valeur UTC _03:25
_.
2011-11-23T08: 55: 52.992 + 05: 30 [Asie/Calcutta]
Vous pouvez appliquer le fuseau horaire par défaut actuel de la machine virtuelle Java. Attention, les valeurs par défaut peuvent changer à tout momentpendant l'exécution. Tout code dans n'importe quel fil de n'importe quelle application de la machine virtuelle Java peut modifier la valeur par défaut actuelle. Si important, demandez à l'utilisateur pour leur fuseau horaire souhaité/prévu.
_ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
_
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes legacy date-heure telles que Java.util.Date
, Calendar
, & SimpleDateFormat
=.
Le projet Joda-Time , maintenant en mode de maintenance , conseille la migration vers Java.time classes.
Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .
Avec un pilote JDBC conforme à JDBC 4.2 ou ulté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 ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval
, YearWeek
, YearQuarter
, et plus .
Si la valeur en millis correspond au nombre de millis depuis le 1er janvier 1970 GMT, comme il est standard pour la machine virtuelle Java, 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.
Le moyen le plus simple de procéder consiste à utiliser classe Joda DateTime et à spécifier à la fois l'horodatage en millisecondes et la date/heure souhaitée.
Je recommande fortement d'éviter les classes Java Date et Calendar intégrées; ils sont terribles.
Ma solution
public class CalendarUtils {
public static String dateFormat = "dd-MM-yyyy hh:mm";
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(Long.parseLong(milliSeconds));
return simpleDateFormat.format(calendar.getTime());
}
}
Je le fais comme ça:
static String formatDate(long dateInMillis) {
Date date = new Date(dateInMillis);
return DateFormat.getDateInstance().format(date);
}
Vous pouvez également utiliser getDateInstance(int style)
avec les paramètres suivants:
DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
La classe SimpleDateFormat a une méthode appelée SetTimeZone (TimeZone) héritée de la classe DateFormat. http://docs.Oracle.com/javase/6/docs/api/Java/text/DateFormat.html
Manière la plus simple:
private String millisToDate(long millis){
return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
//You can use DateFormat.LONG instead of SHORT
}
Voici ma solution pour obtenir la date de millisecondes au format de date. Vous devez utiliser Joda Library pour que ce code soit exécuté.
import Java.util.GregorianCalendar;
import Java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class time {
public static void main(String args[]){
String str = "1431601084000";
long geTime= Long.parseLong(str);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(geTime);
DateTime jodaTime = new DateTime(geTime,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
System.out.println("Get Time : "+parser1.print(jodaTime));
}
}
Vous pouvez essayer Java.time api;
Instant date = Instant.ofEpochMilli(1549362600000l);
LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);