java.util.Date format konversi tttt-bb-hh ke bb-hh-tttt

89

Saya memiliki java.util.Datedalam format yyyy-mm-dd. Saya ingin dalam formatmm-dd-yyyy

Di bawah ini adalah contoh yang saya coba untuk konversi ini:

// Setting the pattern
SimpleDateFormat sm = new SimpleDateFormat("mm-dd-yyyy");
// myDate is the java.util.Date in yyyy-mm-dd format
// Converting it into String using formatter
String strDate = sm.format(myDate);
//Converting the String back to java.util.Date
Date dt = sm.parse(strDate);

Tetap saja keluaran yang saya dapatkan tidak dalam format mm-dd-yyyy.

Mohon beri tahu saya cara memformat java.util.Datedari yyyy-mm-ddmenjadimm-dd-yyyy

pengguna182944
sumber
2
Apa yang Anda maksud ketika Anda mengatakan .. Saya memiliki java.util.Date dalam format yyyy-mm-dd?
Jayamohan
Artinya format saat ini dalam kode saya untuk menampilkannya ke UI adalah yyyy-mm-dd.
pengguna182944
1
tolong ubah mm kecil menjadi MM
Dilip D

Jawaban:

158

Date adalah wadah untuk jumlah milidetik sejak zaman Unix (00:00:00 UTC pada 1 Januari 1970).

Tidak ada konsep format.

Java 8+

LocalDateTime ldt = LocalDateTime.now();
System.out.println(DateTimeFormatter.ofPattern("MM-dd-yyyy", Locale.ENGLISH).format(ldt));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH).format(ldt));
System.out.println(ldt);

Keluaran ...

05-11-2018
2018-05-11
2018-05-11T17:24:42.980

Jawa 7-

Anda harus memanfaatkan ThreeTen Backport

Jawaban Asli

Sebagai contoh...

Date myDate = new Date();
System.out.println(myDate);
System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(myDate));
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(myDate));
System.out.println(myDate);

Keluaran ...

Wed Aug 28 16:20:39 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 16:20:39 EST 2013

Tidak ada pemformatan yang mengubah nilai dasarnya Date. Ini adalah tujuan dari DateFormatters

Diperbarui dengan contoh tambahan

Kalau-kalau contoh pertama tidak masuk akal ...

Contoh ini menggunakan dua format untuk memformat tanggal yang sama. Saya kemudian menggunakan format yang sama ini untuk mengurai Stringnilai kembali ke Dates. Parse yang dihasilkan tidak mengubah cara Datemelaporkan nilainya.

Date#toStringhanyalah tumpukan isinya. Anda tidak dapat mengubah ini, tetapi Anda dapat memformat Dateobjek sesuka Anda

try {
    Date myDate = new Date();
    System.out.println(myDate);

    SimpleDateFormat mdyFormat = new SimpleDateFormat("MM-dd-yyyy");
    SimpleDateFormat dmyFormat = new SimpleDateFormat("yyyy-MM-dd");

    // Format the date to Strings
    String mdy = mdyFormat.format(myDate);
    String dmy = dmyFormat.format(myDate);

    // Results...
    System.out.println(mdy);
    System.out.println(dmy);
    // Parse the Strings back to dates
    // Note, the formats don't "stick" with the Date value
    System.out.println(mdyFormat.parse(mdy));
    System.out.println(dmyFormat.parse(dmy));
} catch (ParseException exp) {
    exp.printStackTrace();
}

Output mana ...

Wed Aug 28 16:24:54 EST 2013
08-28-2013
2013-08-28
Wed Aug 28 00:00:00 EST 2013
Wed Aug 28 00:00:00 EST 2013

Juga, berhati-hatilah dengan pola format. Perhatikan lebih dekat SimpleDateFormatuntuk memastikan Anda tidak menggunakan pola yang salah;)

MadProgrammer
sumber
Jawaban yang bagus membantu saya. Mencoba menjalankan aplikasi sampel baris perintah untuk menguji format (sebelum menggunakan di kelas Android) - tidak dapat menemukan impor yang saya butuhkan. Tak satu pun dari jawaban yang diberikan ingat untuk memasukkan bahwa: import java.text.SimpleDateFormat;
raddevus
34
SimpleDateFormat("MM-dd-yyyy");

dari pada

SimpleDateFormat("mm-dd-yyyy");

karena MM points Month,mm points minutes

SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
String strDate = sm.format(myDate);
pengguna baru
sumber
Selain perubahan ini, ada perubahan lain yang perlu saya lakukan dalam metode util di atas? Saya tidak dapat langsung mengujinya, karena itu menanyakan ini. Juga, apakah ada cara yang lebih baik untuk memformat java.util.Date?
pengguna182944
15

'M' (Capital) mewakili bulan & 'm' (Simple) mewakili menit

Beberapa contoh selama berbulan-bulan

'M' -> 7  (without prefix 0 if it is single digit)
'M' -> 12

'MM' -> 07 (with prefix 0 if it is single digit)
'MM' -> 12

'MMM' -> Jul (display with 3 character)

'MMMM' -> December (display with full name)

Beberapa contoh untuk menit

'm' -> 3  (without prefix 0 if it is single digit)
'm' -> 19
'mm' -> 03 (with prefix 0 if it is single digit)
'mm' -> 19
darshakat
sumber
3

tl; dr

LocalDate.parse( 
    "01-23-2017" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)

Detail

Saya memiliki java.util.Date dalam format yyyy-mm-dd

Seperti yang disebutkan lain, Datekelas tidak memiliki format. Ini memiliki hitungan milidetik sejak awal tahun 1970 di UTC. Tanpa pamrih.

java.time

Jawaban lain menggunakan kelas tanggal-waktu lama lama yang merepotkan, sekarang digantikan oleh kelas java.time.

Jika Anda memiliki java.util.Date, konversikan ke Instantobjek. The Instantkelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).

Instant instant = myUtilDate.toInstant();

Zona waktu

Jawaban lainnya mengabaikan masalah penting zona waktu. Menentukan tanggal membutuhkan zona waktu. Untuk saat tertentu, tanggal bervariasi di seluruh dunia menurut zona. Beberapa menit setelah tengah malam di Paris Prancis adalah hari baru, sementara masih "kemarin" di Montréal Québec.

Tentukan zona waktu yang Anda inginkan untuk konteks Anda Instant.

ZoneId z = ZoneId.of( "America/Montreal" );

Terapkan ZoneIduntuk mendapatkan a ZonedDateTime.

ZonedDateTime zdt = instant.atZone( z );

LocalDate

Jika Anda hanya peduli dengan tanggal tanpa waktu, ekstrak file LocalDate.

LocalDate localDate = zdt.toLocalDate();

Untuk menghasilkan string dalam format ISO 8601 standar, YYYY-MM-DD, cukup panggil toString. Kelas java.time menggunakan format standar secara default saat membuat / mem-parsing string.

String output = localDate.toString();

2017-01-23

Jika Anda menginginkan format MM-DD-YYYY, tentukan pola pemformatan.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );

Perhatikan bahwa kode pola pemformatan peka huruf besar-kecil. Kode di Pertanyaan salah digunakan mm(menit dalam jam) daripada MM(bulan dalam tahun).

Gunakan DateTimeFormatterobjek yang sama untuk parsing. Kelas java.time aman untuk thread, jadi Anda dapat menyimpan objek ini dan menggunakannya kembali berulang kali bahkan di seluruh thread.

LocalDate localDate = LocalDate.parse( "01-23-2017" , f );

Tentang java.time

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

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

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

Di mana mendapatkan kelas java.time?

Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .

Basil Bourque
sumber
1

Ini adalah penggunaan sederhana di bawah kode.

final Date todayDate = new Date();

System.out.println(todayDate);

System.out.println(new SimpleDateFormat("MM-dd-yyyy").format(todayDate));

System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(todayDate));

System.out.println(todayDate);
Ujitha
sumber
(A) Kode ini mengabaikan masalah penting zona waktu. (B) Kode ini menggunakan kelas tanggal-waktu lama bermasalah yang telah warisan selama bertahun-tahun sekarang. Hindari mereka. Disediakan oleh kelas java.time.
Basil Bourque
1

Anda bisa mendapatkan hari, bulan dan tahun dan bisa menggabungkannya atau bisa menggunakan format MM-dd-yyyy seperti yang diberikan di bawah ini.

Date date1 = new Date();
String mmddyyyy1 = new SimpleDateFormat("MM-dd-yyyy").format(date1);
System.out.println("Formatted Date 1: " + mmddyyyy1);



Date date2 = new Date();
Calendar calendar1 = new GregorianCalendar();
calendar1.setTime(date2);
int day1   = calendar1.get(Calendar.DAY_OF_MONTH);
int month1 = calendar1.get(Calendar.MONTH) + 1; // {0 - 11}
int year1  = calendar1.get(Calendar.YEAR);
String mmddyyyy2 = ((month1<10)?"0"+month1:month1) + "-" + ((day1<10)?"0"+day1:day1) + "-" + (year1);
System.out.println("Formatted Date 2: " + mmddyyyy2);



LocalDateTime ldt1 = LocalDateTime.now();  
DateTimeFormatter format1 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy3 = ldt1.format(format1);  
System.out.println("Formatted Date 3: " + mmddyyyy3);  



LocalDateTime ldt2 = LocalDateTime.now();
int day2 = ldt2.getDayOfMonth();
int mont2= ldt2.getMonthValue();
int year2= ldt2.getYear();
String mmddyyyy4 = ((mont2<10)?"0"+mont2:mont2) + "-" + ((day2<10)?"0"+day2:day2) + "-" + (year2);
System.out.println("Formatted Date 4: " + mmddyyyy4);



LocalDateTime ldt3 = LocalDateTime.of(2020, 6, 11, 14, 30); // int year, int month, int dayOfMonth, int hour, int minute
DateTimeFormatter format2 = DateTimeFormatter.ofPattern("MM-dd-yyyy");  
String mmddyyyy5 = ldt3.format(format2);   
System.out.println("Formatted Date 5: " + mmddyyyy5); 



Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(new Date());
int day3  = calendar2.get(Calendar.DAY_OF_MONTH); // OR Calendar.DATE
int month3= calendar2.get(Calendar.MONTH) + 1;
int year3 = calendar2.get(Calendar.YEAR);
String mmddyyyy6 = ((month3<10)?"0"+month3:month3) + "-" + ((day3<10)?"0"+day3:day3) + "-" + (year3);
System.out.println("Formatted Date 6: " + mmddyyyy6);



Date date3 = new Date();
LocalDate ld1 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date3)); // Accepts only yyyy-MM-dd
int day4  = ld1.getDayOfMonth();
int month4= ld1.getMonthValue();
int year4 = ld1.getYear();
String mmddyyyy7 = ((month4<10)?"0"+month4:month4) + "-" + ((day4<10)?"0"+day4:day4) + "-" + (year4);
System.out.println("Formatted Date 7: " + mmddyyyy7);



Date date4 = new Date();
int day5   = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getDayOfMonth();
int month5 = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getMonthValue();
int year5  = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date4)).getYear();
String mmddyyyy8 = ((month5<10)?"0"+month5:month5) + "-" + ((day5<10)?"0"+day5:day5) + "-" + (year5);
System.out.println("Formatted Date 8: " + mmddyyyy8);



Date date5 = new Date();
int day6   = Integer.parseInt(new SimpleDateFormat("dd").format(date5));
int month6 = Integer.parseInt(new SimpleDateFormat("MM").format(date5));
int year6  = Integer.parseInt(new SimpleDateFormat("yyyy").format(date5));
String mmddyyyy9 = ((month6<10)?"0"+month6:month6) + "-" + ((day6<10)?"0"+day6:day6) + "-" + (year6);`enter code here`
System.out.println("Formatted Date 9: " + mmddyyyy9);
fnizami
sumber
1

Silahkan ubah bulan kecil "mm" menjadi kapital "MM" maka akan berhasil. Untuk referensi di bawah ini adalah contoh kode.

        Date myDate = new Date();
        SimpleDateFormat sm = new SimpleDateFormat("MM-dd-yyyy");
       
        String strDate = sm.format(myDate);
        
        Date dt = sm.parse(strDate);
        System.out.println(strDate);
Dilip D
sumber