Membuat objek tanggal java dari tahun, bulan, hari

99
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

Outputnya adalah:

1988
Rabu 25 Jan 00:00:08 IST 1989

Saya lewat 25 12 1988tapi saya mengerti 25 Jan 1989. Mengapa?

JAVAGeek
sumber
1
Apa b dalam kode?
MysteryGuy

Jawaban:

113

Bulan berbasis nol di Kalender. Jadi 12 diartikan sebagai desember + 1 bulan. Menggunakan

c.set(year, month - 1, day, 0, 0);  
JB Nizet
sumber
5
Desainer IBM API, desainer JavaScript API. Selain itu, mungkin tidak ada. Perhatikan bahwa Kalender sekarang telah ditinggalkan oleh Java 8 java.time API, yang melakukan hal yang benar.
JB Nizet
67

Itu cara favorit saya sebelum Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Saya akan mengatakan ini adalah pendekatan yang lebih bersih daripada:

calendar.set(year, month - 1, day, 0, 0);
Fred Porciúncula
sumber
4
Bulan dapat ditentukan menggunakan Calendarkonstanta misalnya. Calendar.FEBRUARY.
Geekarist
1
Hati-hati, bulan dulu diberi nomor dari nol di Java 7. Gunakan konstanta untuk menghindari masalah.
jediz
Poin yang harus dibuat - keduanya memberikan hasil yang berbeda saat memanggil getTime(). Menyetel info di konstruktor memberikan waktu di awal hari dimana pendekatan terakhir menggunakan waktu saat ini. Lihat dokumennya . Jadi yang pertama mungkin adalah pendekatan yang lebih baik, dengan asumsi apa yang sebenarnya coba dilakukan orang.
funct7
28

java.time

Menggunakan java.timekerangka kerja bawaan Java 8

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Jika Anda juga membutuhkan informasi tentang waktu (jam, menit, detik) gunakan beberapa konversi dari LocalDatemenjadiLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00
Przemek
sumber
Jawaban Baik, tetapi tentukan zona waktu jika diketahui. A LocalDatetidak memiliki zona waktu sehingga tidak mewakili momen yang tepat di garis waktu. Jika konteks Anda menunjukkan zona waktu, terapkan untuk mendapatkan ZonedDateTimeobjek: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque
9

Representasi Kalender Java bukanlah yang terbaik, mereka sedang mengerjakannya untuk Java 8. Saya akan menyarankan Anda untuk menggunakan Joda Time atau pustaka serupa lainnya.

Berikut adalah contoh cepat menggunakan LocalDate dari perpustakaan Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Di sini Anda dapat mengikuti tutorial mulai cepat.

Fdiazreal.dll
sumber
6

Lihat JavaDoc :

bulan - nilai yang digunakan untuk menyetel bidang kalender BULAN. Nilai bulan berbasis 0. misalnya, 0 untuk Januari.

Jadi, bulan yang Anda tetapkan adalah bulan pertama tahun depan.

zw324
sumber
0

Jadikan hidup Anda mudah saat bekerja dengan tanggal, stempel waktu, dan durasi. Gunakan HalDateTime from

http://sourceforge.net/projects/haldatetime/?source=directory

Misalnya Anda bisa menggunakannya untuk mengurai input Anda seperti ini:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

Anda juga dapat menentukan pola penguraian dan pencetakan.

Hajo Lemcke
sumber
3
Sepertinya Anda mempromosikan kelas perpustakaan Anda sendiri? Itu mungkin diizinkan, tetapi akan terlihat lebih bagus jika Anda menyebutkan jika Anda adalah pengembang utama HalDateTime.
Ole VV
Saya tidak memberi suara negatif. Namun hidup tidak pernah mudah dengan kencan. Perpustakaan Anda tidak akan mengubah fakta itu.
kiltek
Mengapa tidak memilih? Perpustakaan saya berasal dari tahun 2013. Semua fungsionalitas tersedia di java.time sebagaimana ditentukan dalam JSR 310 yang menurut saya pribadi adalah salah satu API yang dirancang terbaik. Saya sangat merekomendasikan menggunakan yang satu itu.
Hajo Lemcke