Comment obtenir l'heure actuelle au format AAAA-MM-JJ HH: MI: Sec.Milliseconde en Java?

641

Le code ci-dessous me donne l'heure actuelle. Mais cela ne dit rien sur les millisecondes.

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

Je reçois la date au format 2009-09-22 16:47:08 (AAAA-MM-JJ HH: MI: Sec) .

Mais je veux récupérer l'heure actuelle au format 2009-09-22 16:47:08.128((AAAA-MM-JJ HH: MI: Sec.Ms) - où 128 indique la milliseconde.

SimpleTextFormatfonctionnera bien. Ici, l'unité de temps la plus basse est la seconde, mais comment puis-je également obtenir la milliseconde?

Sunil Kumar Sahoo
la source
32
Lorsque tout le reste échoue, lisez la documentation .
Hot Licks
4
Pour votre information, les classes date de temps anciens gênants tels que java.util.Date, java.util.Calendaret java.text.SimpleTextFormatsont maintenant héritage , supplanté par les java.time classes. Voir Tutoriel par Oracle .
Basil Bourque

Réponses:

1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Jay Jay
la source
Par curiosité, quel avantage l'utilisation de SimpleDateFormat apporte-t-elle uniquement: dateTime.ToString ("aaaa-MM-jj HH: mm: ss.SSS")?
NickG
10
@NickG Où est cette toString(String format)méthode? Le java.util.Datene semble pas l'avoir. Faites-vous référence à l'API Joda Time? Mais un avantage possible est la réutilisation du même objet formateur. Un autre est que vous n'avez pas à ajouter d'API - la classe Date est une classe de bibliothèque Java standard.
ADTC
22
Dans Java 8, vous pouvez utiliser DateTimeFormatter dans le même but.
Vitalii Fedorenko
7
SimpleDateFormat n'est pas thread-safe, mais le nouveau DateTimeFormatter est thread-safe.
devdanke
15
Utilisation de l'API datetime Java 8:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha
202

Une doublure Java

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

dans le style JDK8

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}
Joram
la source
9
LocalDateTime et DateTimeFormatter sont thread-safe contrairement à SimpleDateFormat
Maxple
@Maxple tout cas où SimpleDateFormat cause des problèmes?
gaurav
1
@gaurav est ici votre cookie: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991
103

Il vous suffit d'ajouter le champ en millisecondes dans votre chaîne de format de date:

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Le document API de SimpleDateFormat décrit la chaîne de format en détail.

Michael Borgwardt
la source
45

essaye ça:-

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
Date date = new Date();
System.out.println(dateFormat.format(date));

ou

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
duggu
la source
31

tl; dr

Instant.now()
       .toString()

2016-05-06T23: 24: 25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19: 24: 25.694

java.time

Dans Java 8 et versions ultérieures, le framework java.time est intégré à Java 8 et versions ultérieures. Ces nouvelles classes remplacent les anciennes classes gênantes java.util.Date/.Calendar. Les nouvelles classes sont inspirées par le framework Joda-Time très réussi , destiné à lui succéder, de concept similaire mais ré-architecturé. Défini par JSR 310 . Prolongé par le projet ThreeTen-Extra . Voir le tutoriel .

Sachez que java.time est capable d'une résolution en nanosecondes (9 décimales en fraction de seconde), par rapport à la résolution en millisecondes (3 décimales) des deux java.util.Date et Joda-Time. Ainsi, lors du formatage pour afficher uniquement 3 décimales, vous pouvez masquer des données.

Si vous souhaitez éliminer toutes les microsecondes ou nanosecondes de vos données, tronquez.

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

Les classes java.time utilisent le format ISO 8601 par défaut lors de l'analyse / génération de chaînes. A Zà la fin est l'abréviation de Zuluet signifie UTC .

An Instantreprésente un moment sur la timeline en UTC avec une résolution allant jusqu'à nanosecondes . La capture de l'instant présent dans Java 8 est limitée à des millisecondes , avec une nouvelle implémentation dans Java 9 capturant jusqu'à nanosecondes en fonction des capacités de l'horloge matérielle de votre ordinateur.

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23: 24: 25.694Z

Remplacez le Tmilieu par un espace et le Zrien, pour obtenir la sortie souhaitée.

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23: 24: 25.694

Comme vous ne vous souciez pas d'inclure le décalage ou le fuseau horaire, définissez une date-heure "locale" sans rapport avec une localité particulière.

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

Joda-Time

La bibliothèque Joda-Time très réussie a été l'inspiration pour le framework java.time. Il est conseillé de migrer vers java.time quand cela vous convient.

Le format ISO 8601 comprend des millisecondes et est la valeur par défaut pour la bibliothèque Joda-Time 2.4.

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

Lors de l'exécution ...

Now: 2013-11-26T20:25:12.014Z

En outre, vous pouvez demander la fraction de millisecondes de seconde sous forme de nombre, si nécessaire:

int millisOfSecond = myDateTime.getMillisOfSecond ();
Basil Bourque
la source
9

J'utiliserais quelque chose comme ça:

String.format("%tF %<tT.%<tL", dateTime);

La variable dateTimepeut avoir n'importe quelle valeur de date et / ou d'heure, voir JavaDoc pourFormatter .

Usagi Miyamoto
la source
9

Le moyen le plus simple était (avant Java 8) d'utiliser,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Mais SimpleDateFormat n'est pas thread-safe. Ni java.util.Date . Cela conduira à des problèmes de concurrence potentiels pour les utilisateurs. Et il existe de nombreux problèmes dans ces conceptions existantes. Pour les surmonter maintenant dans Java 8, nous avons un package séparé appelé java.time . Ce document de date et d'heure Java SE 8 a une bonne vue d'ensemble à ce sujet.

Donc, en Java 8, quelque chose comme ci-dessous fera l'affaire (pour formater la date / heure actuelle),

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

Et une chose à noter est qu'il a été développé avec l'aide de la populaire bibliothèque tierce joda-time ,

Le projet a été mené conjointement par l'auteur de Joda-Time (Stephen Colebourne) et Oracle, sous JSR 310, et apparaîtra dans le nouveau package Java SE 8 java.time.

Mais maintenant, le joda-timedevient obsolète et a demandé aux utilisateurs de migrer vers le nouveau java.time.

Notez qu'à partir de Java SE 8, les utilisateurs sont invités à migrer vers java.time (JSR-310) - une partie centrale du JDK qui remplace ce projet

Quoi qu'il en soit, cela étant dit,

Si vous avez une instance d' agenda que vous pouvez utiliser ci-dessous pour la convertir en nouvelle java.time,

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

Si vous aviez un objet Date,

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

Si vous venez d'avoir l'époque millisecondes,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());
premier
la source
le niveau d'API minimum est de 26
AbhinayMe
4

Pour compléter les réponses ci-dessus, voici un petit exemple de travail d'un programme qui imprime l'heure et la date actuelles, y compris les millisecondes.

import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}

ttb
la source
2

Utilisez ceci pour obtenir votre heure actuelle dans le format spécifié:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }
Abhishek Sengupta
la source
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par Oracle .
Basil Bourque
En fait, j'utilisais cette solution pour Android App, mais pour utiliser la classe Java.time dans Android, nous devons avoir une API définie sur au moins 27. Quoi qu'il en soit, merci de partager les informations.
Abhishek Sengupta
Presque toutes les fonctionnalités de java.time sont rétroportées vers Java 6 et 7 dans le projet ThreeTen-Backport avec pratiquement la même API. Plus adapté à Android <26 dans le projet ThreeTenABP . Il n'y a donc aucune raison de toucher à nouveau ces horribles classes de date et d'heure.
Basil Bourque
2

J'ai un exemple simple ici pour afficher la date et l'heure avec la milliseconde ......

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}
Fridjato Part Fridjat
la source
Ça a l'air bien, mais cela ajoute-t-il un aperçu sur, disons, le commentaire de 5 ans de rsinha ?
greybeard
1

Rép:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);
umamaheshwar thati
la source
0

java.text (avant java 8)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());
Mykhaylo Adamovych
la source
-1

Vous pouvez simplement l'obtenir dans le format que vous souhaitez.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
Android Dev
la source