Bagaimana cara mendapatkan waktu saat ini dalam format YYYY-MM-DD HH: MI: Sec.Millisecond di Java?

641

Kode di bawah ini memberi saya waktu saat ini. Tetapi tidak mengatakan apa-apa tentang milidetik.

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

Saya mendapatkan tanggal dalam format 2009-09-22 16:47:08 (YYYY-MM-DD HH: MI: Sec) .

Tapi saya ingin mengambil waktu saat ini dalam format 2009-09-22 16:47:08.128((YYYY-MM-DD HH: MI: Sec.Ms) - di mana 128 memberitahu milidetik.

SimpleTextFormatakan bekerja dengan baik. Di sini satuan waktu terendah adalah yang kedua, tetapi bagaimana cara mendapatkan milidetik juga?

Sunil Kumar Sahoo
sumber
32
Ketika semuanya gagal, baca dokumentasi .
Hot Licks
4
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleTextFormatsekarang warisan , digantikan oleh java.time kelas. Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
JayJay
sumber
Karena penasaran, apa manfaat menggunakan SimpleDateFormat hanya membawa: dateTime.ToString ("yyyy-MM-dd HH: mm: ss.SSS")?
NickG
10
@NickG Di mana toString(String format)metode ini ? The java.util.Datetampaknya tidak memilikinya. Apakah Anda mengacu pada API Waktu Joda? Tetapi satu manfaat yang mungkin adalah penggunaan kembali objek formatter yang sama. Lain adalah Anda tidak perlu menambahkan API - Kelas tanggal adalah kelas perpustakaan Java standar.
ADTC
22
Di Java 8 Anda dapat menggunakan DateTimeFormatter untuk tujuan yang sama.
Vitalii Fedorenko
7
SimpleDateFormat tidak aman utas, tetapi DateTimeFormatter yang lebih baru aman utas.
devdanke
15
Menggunakan Java 8 datetime API:LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha
202

Java one liner

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

dalam gaya JDK8

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}
Joram
sumber
9
LocalDateTime dan DateTimeFormatter aman dari thread, tidak seperti SimpleDateFormat
Maxple
@Maxple setiap kasus di mana SimpleDateFormat menyebabkan masalah?
gaurav
1
@gaurav di sini adalah cookie Anda: callicoder.com/java-simpledateformat-thread-safety-issues
kidnan1991
103

Anda hanya perlu menambahkan bidang milidetik dalam string format tanggal Anda:

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

The API doc dari SimpleDateFormat menggambarkan format string secara rinci.

Michael Borgwardt
sumber
45

coba ini:-

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

atau

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
Duggu
sumber
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

waktu java

Di Java 8 dan yang lebih baru, kami memiliki kerangka java.time yang dibangun ke dalam Java 8 dan yang lebih baru. Kelas-kelas baru menggantikan kelas java.util.Date/.Calendar tua yang merepotkan. Kelas-kelas baru terinspirasi oleh kerangka kerja Joda-Time yang sangat sukses , dimaksudkan sebagai penggantinya, serupa dalam konsepnya tetapi dirancang ulang. Didefinisikan oleh JSR 310 . Diperpanjang oleh proyek ThreeTen-Extra . Lihat Tutorialnya .

Perlu diketahui bahwa java.time mampu resolusi nanosecond (9 tempat desimal dalam sepersekian detik), dibandingkan resolusi milidetik (3 tempat desimal) dari java.util.Date & Joda-Time. Jadi ketika memformat hanya menampilkan 3 tempat desimal, Anda bisa menyembunyikan data.

Jika Anda ingin menghilangkan mikrodetik atau nanodetik dari data Anda, potong.

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

Kelas java.time menggunakan format ISO 8601 secara default saat parsing / menghasilkan string. A Zpada akhirnya adalah kependekan dari Zulu, dan berarti UTC .

An Instantmewakili momen pada timeline di UTC dengan resolusi hingga nanodetik . Menangkap momen saat ini di Java 8 terbatas pada milidetik , dengan implementasi baru di Jawa 9 menangkap hingga nanodetik tergantung pada kemampuan jam perangkat keras komputer Anda.

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

2016-05-06T23: 24: 25.694Z

Ganti yang Tdi tengah dengan spasi, dan yang Ztidak ada, untuk mendapatkan hasil yang diinginkan.

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

Karena Anda tidak peduli dengan menyertakan offset atau zona waktu, buat tanggal-waktu "lokal" tidak terkait dengan lokalitas tertentu.

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

Joda-Time

Perpustakaan Joda-Time yang sangat sukses adalah inspirasi untuk kerangka java.time. Disarankan untuk bermigrasi ke java.time saat nyaman.

Format ISO 8601 mencakup milidetik, dan merupakan default untuk perpustakaan Joda-Time 2.4.

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

Saat dijalankan ...

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

Anda juga dapat meminta fraksi milidetik per detik sebagai angka, jika diperlukan:

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

Saya akan menggunakan sesuatu seperti ini:

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

Variabel dateTimebisa berupa tanggal dan / atau nilai waktu, lihat JavaDoc untukFormatter .

Usagi Miyamoto
sumber
9

Cara termudah adalah dengan (sebelum Java 8) digunakan,

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

Tapi SimpleDateFormat tidak aman utas. Baik java.util.Date . Ini akan mengarah pada potensi masalah konkurensi bagi pengguna. Dan ada banyak masalah dalam desain yang ada. Untuk mengatasinya sekarang di Java 8 kami memiliki paket terpisah yang disebut java.time . Ini Java SE 8 Tanggal dan Waktu dokumen memiliki gambaran yang baik tentang hal itu.

Jadi di Java 8 sesuatu seperti di bawah ini akan melakukan trik (untuk memformat tanggal / waktu saat ini),

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

Dan satu hal yang perlu diperhatikan adalah ini dikembangkan dengan bantuan perpustakaan pihak ketiga yang populer saat itu ,

Proyek ini telah dipimpin bersama oleh penulis Joda-Time (Stephen Colebourne) dan Oracle, di bawah JSR 310, dan akan muncul dalam paket Java SE 8 Java.time baru.

Tapi sekarang joda-timesudah menjadi usang dan meminta pengguna untuk bermigrasi ke yang baru java.time.

Perhatikan bahwa mulai dari Java SE 8 dan seterusnya, pengguna diminta untuk bermigrasi ke java.time (JSR-310) - bagian inti dari JDK yang menggantikan proyek ini

Lagi pula setelah mengatakan itu,

Jika Anda memiliki instance Kalender, Anda dapat menggunakan di bawah ini untuk mengubahnya menjadi yang baru 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

Jika Anda memiliki objek 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

Jika Anda hanya memiliki zaman milidetik,

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());
utama
sumber
level API minimum adalah 26
AbhinayMe
4

Untuk melengkapi jawaban di atas, berikut adalah contoh kerja kecil dari program yang mencetak waktu dan tanggal saat ini, termasuk milidetik.

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

Gunakan ini untuk mendapatkan waktu Anda saat ini dalam format yang ditentukan:

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }
Abhishek Sengupta
sumber
FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque
Sebenarnya saya menggunakan solusi ini untuk Aplikasi Android, tetapi untuk menggunakan kelas Java.time di Android kita harus memiliki API set setidaknya 27. Pokoknya terima kasih telah berbagi informasi.
Abhishek Sengupta
Hampir semua fungsi java.time di -port-back ke Java 6 & 7 di proyek ThreeTen-Backport dengan API yang hampir sama. Lebih lanjut diadaptasi ke Android <26 dalam proyek ThreeTenABP . Jadi tidak ada alasan untuk pernah menyentuh kelas-tanggal tua yang mengerikan itu lagi.
Basil Bourque
2

Saya punya contoh sederhana di sini untuk menampilkan tanggal dan waktu dengan Millisecond ......

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
sumber
Terlihat bagus, tetapi apakah itu menambah wawasan, katakanlah, komentar 5 tahun rsinha ?
greybeard
1

Jawab:

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
sumber
0

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

waktu java

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

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

Anda bisa mendapatkannya dalam format yang Anda inginkan.

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