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?


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

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

9
LocalDateTime dan DateTimeFormatter aman dari thread, tidak seperti SimpleDateFormat
Maxple

@Maxple setiap kasus di mana SimpleDateFormat menyebabkan masalah?
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" , " " )

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


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

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


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

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

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


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

-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()));
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.