Wie erhalte ich die aktuelle Uhrzeit im Format JJJJ-MM-TT HH: MI: Sek.Millisekunden in Java?

639

Der folgende Code gibt mir die aktuelle Zeit. Aber es sagt nichts über Millisekunden aus.

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

Ich erhalte ein Datum im Format 2009-09-22 16:47:08 (JJJJ-MM-TT HH: MI: Sek.) .

Aber ich möchte die aktuelle Zeit im Format 2009-09-22 16:47:08.128((JJJJ-MM-TT HH: MI: Sek.Ms) abrufen - wobei 128 die Millisekunde angibt.

SimpleTextFormatwird gut funktionieren. Hier ist die niedrigste Zeiteinheit die zweite, aber wie komme ich auch zur Millisekunde?

Sunil Kumar Sahoo
quelle
32
Wenn alles andere fehlschlägt, lesen Sie die Dokumentation .
Hot Licks
4
Zu Ihrer Information, die störenden alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleTextFormatsind jetzt Erbe , durch die verdrängte java.time Klassen. Siehe Tutorial von Oracle .
Basil Bourque

Antworten:

1002
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
JayJay
quelle
Welchen Nutzen bringt die Verwendung von SimpleDateFormat aus Neugier nur: dateTime.ToString ("JJJJ-MM-TT HH: mm: ss.SSS")?
NickG
10
@ NickG Wo ist diese toString(String format)Methode? Das java.util.Datescheint es nicht zu haben. Beziehen Sie sich auf die Joda Time API? Ein möglicher Vorteil ist jedoch die Wiederverwendung desselben Formatierungsobjekts. Zum anderen müssen Sie keine API hinzufügen. Die Date-Klasse ist eine Standard-Java-Bibliotheksklasse.
ADTC
22
In Java 8 können Sie DateTimeFormatter für denselben Zweck verwenden.
Vitalii Fedorenko
7
SimpleDateFormat ist nicht threadsicher, aber der neuere DateTimeFormatter ist threadsicher.
Devdanke
15
Verwenden von Java 8 datetime API:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha
202

Ein Java One Liner

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

im JDK8-Stil

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}
Joram
quelle
9
LocalDateTime und DateTimeFormatter sind im Gegensatz zu SimpleDateFormat
Maxple
@Maxple in jedem Fall, in dem SimpleDateFormat Probleme verursacht?
Gaurav
1
@ Gaurav hier ist Ihr Cookie: callicoder.com/java-simpledateformat-thread-safety-issues
Kidn1991
44

Versuche dies:-

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

oder

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
Duggu
quelle
30

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

In Java 8 und höher ist das Java.time- Framework in Java 8 und höher integriert. Diese neuen Klassen ersetzen die problematischen alten Klassen java.util.Date/.Calendar. Die neuen Klassen sind von dem äußerst erfolgreichen Joda-Time- Framework inspiriert , das als Nachfolger gedacht ist. Das Konzept ist ähnlich, aber neu aufgebaut. Definiert durch JSR 310 . Erweitert um das ThreeTen-Extra- Projekt. Siehe das Tutorial .

Beachten Sie, dass java.time eine Auflösung von Nanosekunden (9 Dezimalstellen in Sekundenbruchteilen) gegenüber der Millisekundenauflösung (3 Dezimalstellen) von java.util.Date und Joda-Time bietet. Wenn Sie also nur 3 Dezimalstellen formatieren, können Sie Daten ausblenden.

Wenn Sie Mikrosekunden oder Nanosekunden aus Ihren Daten entfernen möchten, kürzen Sie diese.

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

Die java.time-Klassen verwenden standardmäßig das ISO 8601- Format, wenn Zeichenfolgen analysiert / generiert werden. A Zam Ende steht für UTCZulu und bedeutet UTC .

An Instantrepräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von bis zu Nanosekunden . Die Erfassung des aktuellen Moments in Java 8 ist auf Millisekunden beschränkt. Eine neue Implementierung in Java 9 erfasst abhängig von den Fähigkeiten der Hardware-Uhr Ihres Computers bis zu Nanosekunden.

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

2016-05-06T23: 24: 25.694Z

Ersetzen Sie das Tin der Mitte durch ein Leerzeichen und das Zdurch nichts, um die gewünschte Ausgabe zu erhalten.

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

Da Sie den Versatz oder die Zeitzone nicht einbeziehen möchten, legen Sie eine "lokale" Datums- und Uhrzeitangabe fest, die nicht mit einem bestimmten Ort zusammenhängt.

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

Joda-Zeit

Die äußerst erfolgreiche Joda-Time-Bibliothek war die Inspiration für das Java.time-Framework. Es ist ratsam, bei Bedarf auf java.time zu migrieren.

Das ISO 8601- Format umfasst Millisekunden und ist die Standardeinstellung für die Joda-Time 2.4-Bibliothek.

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

Beim Laufen…

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

Bei Bedarf können Sie auch den Millisekunden-Sekundenbruchteil als Zahl angeben:

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

Der einfachste Weg war (vor Java 8) zu verwenden,

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

Aber Simple ist nicht Thread-sicher. Weder java.util.Date . Dies führt zu potenziellen Parallelitätsproblemen für Benutzer. Und es gibt viele Probleme bei diesen vorhandenen Designs. Um diese jetzt in Java 8 zu überwinden, haben wir ein separates Paket namens java.time . Dieses Java SE 8- Dokument für Datum und Uhrzeit bietet einen guten Überblick darüber.

In Java 8 reicht also etwas wie das Folgende aus (um das aktuelle Datum und die aktuelle Uhrzeit zu formatieren).

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

Und eine Sache zu beachten ist, dass es mit Hilfe der beliebten Drittanbieter-Bibliothek joda-time entwickelt wurde ,

Das Projekt wurde gemeinsam vom Autor von Joda-Time (Stephen Colebourne) und Oracle unter JSR 310 geleitet und wird im neuen Java SE 8-Paket java.time erscheinen.

Aber jetzt joda-timewird das veraltet und die Benutzer gebeten, auf neue zu migrieren java.time.

Beachten Sie, dass Benutzer ab Java SE 8 aufgefordert werden, zu java.time (JSR-310) zu migrieren - einem Kernbestandteil des JDK, der dieses Projekt ersetzt

Wie auch immer, nachdem ich das gesagt habe,

Wenn Sie eine Kalenderinstanz haben , können Sie diese unten verwenden, um sie in die neue zu konvertieren 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

Wenn Sie ein Date-Objekt hatten,

    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

Wenn Sie gerade die Epoche Millisekunden hatten,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());
Prime
quelle
Mindest-API-Level ist 26
AbhinayMe
8

Ich würde so etwas verwenden:

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

Die Variable dateTimekann ein beliebiger Datums- und / oder Zeitwert sein, siehe JavaDoc fürFormatter .

Usagi Miyamoto
quelle
4

Um die obigen Antworten zu ergänzen, finden Sie hier ein kleines Arbeitsbeispiel eines Programms, das die aktuelle Uhrzeit und das aktuelle Datum einschließlich Millisekunden druckt.

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
quelle
2

Verwenden Sie diese Option, um Ihre aktuelle Zeit im angegebenen Format abzurufen:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }
Abhishek Sengupta
quelle
Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque
Eigentlich habe ich diese Lösung für die Android App verwendet, aber um die Java.time-Klasse in Android zu verwenden, muss die API auf mindestens 27 eingestellt sein. Trotzdem danke, dass Sie die Informationen geteilt haben.
Abhishek Sengupta
Nahezu alle Funktionen von java.time werden im ThreeTen-Backport- Projekt mit praktisch derselben API auf Java 6 und 7 zurückportiert . Weiter angepasst an Android <26 im ThreeTenABP- Projekt. Es gibt also keinen Grund, diese verdammt schrecklichen alten Datums- und Uhrzeitklassen jemals wieder zu berühren.
Basil Bourque
2

Ich habe hier ein einfaches Beispiel, um Datum und Uhrzeit mit Millisekunden anzuzeigen ......

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 Teil Fridjat
quelle
Sieht gut aus, aber gibt es einen Einblick in beispielsweise Rsinhas 5-jährigen Kommentar ?
Graubart
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);
umamaheshwar thati
quelle
0

java.text (vor 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
quelle
-1

Sie können es einfach in dem gewünschten Format erhalten.

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