web-dev-qa-db-fra.com

Comment convertir currentTimeMillis à une date en Java?

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
127
Amit
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);
106
Faisal Ashraf

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);
248
adatapost

tl; dr

_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.
_

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 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]

Zone par défaut

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 );
_

À propos de Java.time

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 .

20
Basil Bourque

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.

13
Bill

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.

12
Cameron Skinner

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());
    }
}
10
Siddarth Kanted

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

6
Yogesh Umesh Vaity

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

5
Jessica Brown

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

}
5
Joaquin Iurchuk

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));

   }
}
2
Archit

Vous pouvez essayer Java.time api;

        Instant date = Instant.ofEpochMilli(1549362600000l);
        LocalDateTime utc = LocalDateTime.ofInstant(date, ZoneOffset.UTC);
1
Narendar Reddy M