Konversi java.util.Date ke String

407

Saya ingin mengonversi java.util.Dateobjek ke Stringdalam Java.

Formatnya adalah 2010-05-30 22:15:52

novicePrgrmr
sumber
@harschware FYI, proyek Joda-Time sekarang dalam mode pemeliharaan , dengan tim menyarankan migrasi ke kelas java.time . Lihat Tutorial oleh Oracle .
Basil Bourque
1
Saya sarankan Anda tidak menggunakan dan Datepada tahun 2019. Kelas itu dirancang dengan buruk dan lama usang. Alih-alih menggunakan Instantatau kelas lain dari java.time, API tanggal dan waktu Java modern .
Ole VV

Jawaban:

757

Konversi Tanggal menjadi String menggunakan DateFormat#formatmetode:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Dari http://www.kodejava.org/examples/86.html

Ali Ben Messaoud
sumber
25
mengapa menggunakan Calendarbukannya polos new Date()? Apakah ada perbedaan?
Alexander Malakhov
10
Hati-hati: SimpleDateFormat bukan thread aman. stackoverflow.com/questions/6840803/…
Zags
23
Kalender adalah kelas abstrak, Tanggal konkret. Date tidak tahu tentang TimeZone, Lokal, atau hal-hal bagus yang tidak pernah kita gunakan.
nckbrz
30
The MM/dd/yyyyformat bodoh dan rusak. Jangan gunakan itu. Selalu gunakan dd/MM/yyyyatau yyyy-MM-dd.
SystemParadox
13
@ SystemParadox - Ini bodoh, tapi itu tidak membuatnya sia-sia. Saya secara khusus diminta untuk menggunakannya karena cocok dengan apa yang orang harapkan pada laporan. (Saya lebih suka di yyyy-MM-ddmana-mana, tetapi apa yang dapat Anda lakukan?).
Autumn Leonard
223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);
Charlie Garts
sumber
63

Commons-lang DateFormatUtils penuh dengan barang (jika Anda memiliki commons-lang di classpath Anda)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");
webpat
sumber
Membutuhkan pemeriksaan tambahan null.
Farrukh Chishti
23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

waktu java

Cara modern adalah dengan kelas java.time yang sekarang menggantikan kelas tanggal lama waktu lama yang merepotkan.

Konversi dulu java.util.Datemenjadi Instant. The Instantkelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).

Konversi ke / dari java.time dilakukan dengan metode baru yang ditambahkan ke kelas lama.

Instant instant = myUtilDate.toInstant();

Baik Anda java.util.Datedan java.time.Instantberada di UTC . Jika Anda ingin melihat tanggal dan waktu sebagai UTC, biarkan saja. Panggilan toStringuntuk menghasilkan sebuah String dalam format standar ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Untuk format lain, Anda perlu mengubah Anda Instantmenjadi lebih fleksibel OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Lihat kode dijalankan langsung di IdeOne.com .

Untuk mendapatkan String dalam format yang Anda inginkan, tentukan a DateTimeFormatter. Anda dapat menentukan format khusus. Tapi saya akan menggunakan salah satu formatters yang telah ditentukan ( ISO_LOCAL_DATE_TIME), dan mengganti Toutputnya dengan SPACE.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Ngomong-ngomong saya tidak merekomendasikan format seperti ini di mana Anda sengaja kehilangan informasi offset-dari-UTC atau zona waktu. Menciptakan ambiguitas tentang makna nilai tanggal-waktu string itu.

Waspadalah juga terhadap kehilangan data, karena setiap pecahan detik diabaikan (secara efektif terpotong) dalam representasi String Anda tentang nilai tanggal-waktu.

Untuk melihat momen yang sama melalui lensa waktu jam dinding wilayah tertentu , terapkan a ZoneIduntuk mendapatkan ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]

Untuk menghasilkan String yang diformat, lakukan hal yang sama seperti di atas tetapi ganti odtdengan zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Jika mengeksekusi kode ini berkali-kali, Anda mungkin ingin menjadi sedikit lebih efisien dan menghindari panggilan String::replace. Menjatuhkan panggilan itu juga membuat kode Anda lebih pendek. Jika diinginkan, tentukan pola pemformatan Anda sendiri di DateTimeFormatterobjek Anda sendiri . Tembolok instance ini sebagai konstanta atau anggota untuk digunakan kembali.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Terapkan formatter itu dengan melewatkan instance.

String output = zdt.format( f );

Tentang java.time

The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan kelas tanggal-waktu lama merepotkan seperti java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time.

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan.

Sebagian besar fungsi java.time di-portingkan ke Java 6 & 7 di ThreeTen-Backport dan selanjutnya diadaptasi ke Android di ThreeTenABP (lihat Cara menggunakan ... ).

Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time.

Basil Bourque
sumber
Berikut adalah contoh kode pemformatan dengan Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim
kode ini tidak berfungsi. OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Apakah ada kode Java 8 baru yang memiliki format yang sama 2014-11-14T14: 05: 09 + 00: 00? Terima kasih
Bob Bolden
@ BobBolden Anda benar, Zdigunakan alih-alih +00:00secara default. Saya memperbaiki jawabannya, terima kasih. FYI, artinya sama:, Zdiucapkan “Zulu” berarti offset nol jam-menit-detik, sama dengan +00:00. Standar ISO 8601 mendukung kedua gaya.
Basil Bourque
@ BasilBourque maaf, ini tidak jelas. Saya memiliki Java 8 dan tidak ada instant.atOffset () sama sekali. Bisakah Anda memberi saran apa yang harus menjadi kode yang benar untuk Java 8 agar memiliki format yang sama persis 2014-11-14T14: 05: 09 + 00: 00 tanpa instant.atOffset ()? Saya agak bingung :(
Bob Bolden
@BobBolden Memang ada atOffsetmetode pada Instantkelas di Jawa 8. Lihat Javadoc: Instant::atOffset. Di Java 8, panggilan seperti Instant.now().atOffset( ZoneOffset.UTC ).toString()akan dijalankan. Periksa importpernyataan Anda . Verifikasi IDE / proyek Anda diatur untuk menjalankan Java 8 atau lebih baru daripada versi Java sebelumnya. Melihat kode dijalankan live di IdeOne.com: ideone.com/2Vm2O5
Basil Bourque
19

Satu-liner yang bersifat steroid di Jawa tua:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Ini menggunakan Formatter dan pengindeksan relatif bukannya SimpleDateFormatyang tidak aman , btw.

Sedikit lebih berulang tetapi hanya membutuhkan satu pernyataan. Ini mungkin berguna dalam beberapa kasus.

Vadzim
sumber
1
Ini jenius. Kinerja yang jauh lebih baik untuk lingkungan terbatas
Ruslan
9

Mengapa Anda tidak menggunakan Joda (org.joda.time.DateTime)? Ini pada dasarnya satu baris.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09
bisu
sumber
Saya sarankan melewati DateTimeZone juga, daripada menetapkan zona waktu default JVM saat ini ke DateTimeobjek. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque
7

Sepertinya Anda mencari SimpleDateFormat .

Format: yyyy-MM-dd kk: mm: ss

pickypg
sumber
Apakah "kk" melakukan sesuatu yang istimewa? Saya pikir Eric menginginkannya dalam waktu 24 jam.
Charlie Garts
2
Ya, jam dalam sehari (1-24), tetapi ini sepertinya bukan yang dibutuhkan OP. HH(0-23) lebih umum.
BalusC
1
@ Garrlie Garam kk pergi dari 1-24, di mana HH pergi dari 0-23, dan mungkin agak sombong saya untuk menganggap dia ingin 1-24 @BalusC Objek DateFormat baik parse dan format.
pickypg
Saya tidak mengerti relevansi dari komentar terakhir Anda. Komentar saya kepada Charlie.
BalusC
Saya sudah terbiasa dengan .Net format, di mana HH adalah 24-waktu, dan hh adalah am / pm. Karena itu kepala-garukan.
Charlie Garts
5

Dalam satu tembakan;)

Untuk mendapatkan Tanggal

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Untuk mendapatkan Waktu

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Untuk mendapatkan tanggal dan waktu

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Selamat coding :)

Chanaka Fernando
sumber
1
FYI, kelas tanggal-waktu lama yang merepotkan seperti java.util.Date,java.util.Calendar , dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 & Java 9. Lihat Tutorial oleh Oracle .
Basil Bourque
4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}
Ashish Tiwari
sumber
4

Cara termudah untuk menggunakannya adalah sebagai berikut:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

di mana "yyyy-MM-dd'T'HH: mm: ss" adalah format tanggal pembacaan

output: Minggu 14 April 16:11:48 EEST 2013

Catatan: HH vs jam - HH mengacu pada format waktu 24 jam - jam mengacu pada format waktu 12 jam

Rami Sharaiyri
sumber
Pertanyaannya adalah tentang konversi yang berlawanan.
Vadzim
4

Jika Anda hanya memerlukan waktu dari tanggal, Anda bisa menggunakan fitur String.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Ini akan secara otomatis memotong bagian waktu dari String dan menyimpannya di dalam timeString.

funaquarius24
sumber
Ini mungkin pecah dengan lokal yang berbeda.
Vadzim
4

Berikut adalah contoh penggunaan Java 8 Time API baru untuk memformat lawas java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

Ini menyenangkan tentang DateTimeFormatterhal itu dapat di-cache secara efisien karena aman-thread (tidak seperti SimpleDateFormat).

Daftar fomatters yang telah ditentukan dan referensi pola notasi .

Kredit:

Bagaimana cara mem-parsing / memformat tanggal dengan LocalDateTime? (Java 8)

Java8 java.util.Date konversi ke java.time.ZonedDateTime

Memformat Instan ke String

Apa perbedaan antara java 8 ZonedDateTime dan OffsetDateTime?

Vadzim
sumber
2

Coba ini,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Keluaran:

2013-05-14 17:07:21

Untuk lebih lanjut tentang format tanggal dan waktu dalam tautan rujukan java di bawah ini

Pusat Bantuan Oracle

Contoh waktu tanggal dalam java

Siwa
sumber
1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}
Artanis
sumber
1

Ayo coba ini

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Atau fungsi utilitas

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

Dari Convert Date to String in Java

David Pham
sumber
1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String
Dulith De Costa
sumber
1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);
jujuBee
sumber
1

Opsi satu baris

Opsi ini mendapatkan satu baris mudah untuk menulis tanggal yang sebenarnya.

Harap perhatikan bahwa ini menggunakan Calendar.classdan SimpleDateFormat, dan kemudian tidak logis untuk menggunakannya di bawah Java8.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
Alejandro Teixeira Muñoz
sumber
1
FYI, kelas tanggal-waktu yang sangat merepotkan 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
1
(1) Jawabannya salah (saya baru dapat 2019-20-23 09:20:22- bulan 20 ??) (2) Saya tidak bisa melihat bahwa jawabannya memberikan apa pun yang belum tercakup dalam jawaban lain. (3) Tolong jangan mengajar anak-anak muda untuk menggunakan kelas yang sudah lama usang dan terkenal merepotkan SimpleDateFormat. Setidaknya bukan sebagai opsi pertama. Dan bukan tanpa reservasi apa pun. Hari ini kami memiliki jauh lebih baik di java.time, API tanggal dan waktu Jawa modern, dan itu DateTimeFormatter.
Ole VV
Ya .... Saya melakukan kesalahan dan lupa untuk memperbaikinya. Saya menambahkannya dengan cepat, dan tidak ingat .. maaf !! dan terima kasih atas komentar Anda semuanya
Alejandro Teixeira Muñoz
@ OleV.V. Tidak semua orang memiliki akses ke data Java Modern dan waktu api ...... jadi ... Ini juga valid jawaban ini ...
Alejandro Teixeira Muñoz
1
Terima kasih atas komentar Anda. Jika Anda ingin memberikan jawaban untuk Java 5, atau untuk Java 6 dan 7 tanpa ketergantungan eksternal, baik-baik saja, tidak apa-apa, hanya mohon jelaskan bahwa itulah yang Anda lakukan. Dan jawaban Anda masih salah, Anda akan mendapatkan kejutan di sekitar Tahun Baru.
Ole VV