Come ottenere l'ora corrente in AAAA-MM-GG HH: MI: formato Sec.Millisecond in Java?


641

Il codice qui sotto mi dà l'ora corrente. Ma non dice nulla sui millisecondi.

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

Ottengo la data nel formato 2009-09-22 16:47:08 (AAAA-MM-GG HH: MI: Sec) .

Ma voglio recuperare l'ora corrente nel formato 2009-09-22 16:47:08.128((AAAA-MM-GG HH: MI: Sec.Ms) - dove 128 indica il millisecondo.

SimpleTextFormatfunzionerà bene. Qui l'unità di tempo più bassa è la seconda, ma come posso ottenere anche i millisecondi?


32
Quando tutto il resto fallisce, leggi la documentazione .
Hot Licks,

4
Cordiali saluti, le classi data-ora vecchi problematici, come java.util.Date, java.util.Calendare java.text.SimpleTextFormatora sono l'eredità , soppiantato dai java.time classi. Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


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

Per curiosità, quali vantaggi comporta l'utilizzo di SimpleDateFormat solo su: dateTime.ToString ("yyyy-MM-dd HH: mm: ss.SSS")?
NickG

10
@NickG Dov'è questo toString(String format)metodo? Il java.util.Datenon sembrano avere. Ti riferisci all'API Joda Time? Ma un possibile vantaggio è il riutilizzo dello stesso oggetto formattatore. Un altro è che non è necessario aggiungere un'API: la classe Date è una classe di libreria Java standard.
ADTC,

22
In Java 8 è possibile utilizzare DateTimeFormatter per lo stesso scopo.
Vitalii Fedorenko,

7
SimpleDateFormat non è thread-safe, ma il più recente DateTimeFormatter è thread-safe.
devdanke,

15
Usando l'API datetime Java 8:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha,

202

Una fodera Java one

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

in stile JDK8

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
LocalDateTime e DateTimeFormatter sono thread-safe a differenza di SimpleDateFormat
Maxple

@Maxple in ogni caso in cui SimpleDateFormat causa problemi?
gaurav,




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" , " " )

06/05/2016 19: 24: 25.694

java.time

In Java 8 e versioni successive, abbiamo il framework java.time integrato in Java 8 e versioni successive. Queste nuove classi soppiantano le fastidiose classi java.util.Date/.Calendar. Le nuove classi sono ispirate al framework Joda-Time di grande successo , inteso come suo successore, simile nel concetto ma riprogettato. Definito da JSR 310 . Esteso dal progetto ThreeTen-Extra . Vedi il tutorial .

Tieni presente che java.time è in grado di risolvere i nanosecondi (9 decimali in frazione di secondo), rispetto al millisecondo risoluzione di (3 decimali) di java.util.Date e Joda-Time. Pertanto, durante la formattazione per visualizzare solo 3 cifre decimali, è possibile nascondere i dati.

Se si desidera eliminare microsecondi o nanosecondi dai dati, troncare.

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

Le classi java.time utilizzano il formato ISO 8601 per impostazione predefinita quando analizzano / generano stringhe. A Zalla fine è l'abbreviazione di Zulu, e significa UTC .

An Instantrappresenta un momento sulla linea temporale in UTC con risoluzione fino a nanosecondi . Catturare il momento attuale in Java 8 è limitato a millisecondi , con una nuova implementazione in Java 9 che cattura fino a nanosecondi a seconda delle capacità dell'orologio hardware del tuo computer.

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

2016-05-06T23: 24: 25.694Z

Sostituisci al Tcentro uno spazio e il Znulla per ottenere l'output desiderato.

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.

06/05/2016 23: 24: 25.694

Poiché non ti interessa includere l'offset o il fuso orario, imposta una data "locale" non correlata a una particolare località.

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

Joda-Time

La libreria Joda-Time di grande successo è stata l'ispirazione per il framework java.time. Consigliabile migrare su java.time quando è conveniente.

Il formato ISO 8601 include millisecondi ed è il valore predefinito per la libreria Joda-Time 2.4.

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

Quando eseguito ...

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

Inoltre, puoi richiedere la frazione di millisecondi di secondo come numero, se necessario:

int millisOfSecond = myDateTime.getMillisOfSecond ();


9

Il modo più semplice era (prima di Java 8) usare,

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

Ma SimpleDateFormat non è thread-safe. Né java.util.Date . Ciò porterà a potenziali problemi di concorrenza per gli utenti. E ci sono molti problemi in quei progetti esistenti. Per superarli ora in Java 8 abbiamo un pacchetto separato chiamato java.time . Questa data e ora di Java SE 8 documento di ha una buona panoramica a riguardo.

Quindi in Java 8 qualcosa come sotto farà il trucco (per formattare la data / ora corrente),

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

E una cosa da notare è che è stato sviluppato con l'aiuto della popolare libreria di terze parti joda-time ,

Il progetto è stato guidato congiuntamente dall'autore di Joda-Time (Stephen Colebourne) e Oracle, sotto JSR 310, e apparirà nel nuovo pacchetto Java SE 8 java.time.

Ma ora joda-timesta diventando obsoleto e ha chiesto agli utenti di migrare a nuovi java.time.

Si noti che da Java SE 8 in poi, agli utenti viene chiesto di migrare su java.time (JSR-310), una parte fondamentale di JDK che sostituisce questo progetto

Comunque detto questo,

Se hai un'istanza di Calendar che puoi utilizzare di seguito per convertirla nella nuova 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

Se avevi un oggetto 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

Se hai appena avuto l'epoca millisecondi,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

il livello minimo di API è 26
AbhinayMe

4

A complemento delle risposte di cui sopra, ecco un piccolo esempio funzionante di un programma che stampa l'ora e la data correnti, inclusi i millisecondi.

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


2

Usa questo per ottenere l' ora corrente nel formato specificato:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

Cordiali saluti, le vecchie classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

In realtà stavo usando questa soluzione per l'app per Android, ma per usare la classe Java.time in Android abbiamo bisogno che l'API sia impostata su almeno 27. Comunque grazie per aver condiviso le informazioni.
Abhishek Sengupta,

Quasi tutte le funzionalità java.time sono trasferite su Java 6 e 7 nel progetto ThreeTen-Backport praticamente con la stessa API. Adattato ulteriormente ad Android <26 nel progetto ThreeTenABP . Quindi non c'è motivo di toccare mai di nuovo quelle maledette orribili vecchie lezioni di data e ora.
Basil Bourque,

2

Ho un semplice esempio qui per visualizzare la data e l'ora con Millisecondi ......

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

Sembra buono, ma aggiunge intuizione, diciamo, al commento di 5 anni di rsinha ?
Greybeard


1

Ans:

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


0

java.text (prima di 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());

-1

Puoi semplicemente ottenerlo nel formato desiderato.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.