Bagaimana cara mendapatkan bulan sebagai bilangan bulat dari objek Date ( java.util.Date
)?
Bagaimana cara mendapatkan bulan sebagai bilangan bulat dari objek Date ( java.util.Date
)?
Jawaban:
Anda juga dapat menggunakan paket java.time di Java 8 dan mengonversi java.util.Date
objek Anda menjadi java.time.LocalDate
objek dan kemudian cukup menggunakan getMonthValue()
metode ini.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Perhatikan bahwa nilai bulan di sini diberikan dari 1 hingga 12 bertentangan dengan cal.get(Calendar.MONTH)
jawaban adarshr yang memberikan nilai dari 0 hingga 11.
Tetapi seperti dikatakan Basil Bourque dalam komentar, cara yang lebih disukai adalah mendapatkan Month
objek enum dengan LocalDate::getMonth
metode tersebut.
ZoneId.of( "America/Montreal" )
.
Month
objek enum daripada bilangan bulat belaka. Month m = localDate.gotMonth();
Lihat LocalDate::getMonth
metode. Menggunakan objek seperti ini membuat kode Anda mendokumentasikan diri sendiri, memastikan keamanan jenis, dan menjamin nilai yang valid. Lihat tutorial Enum oleh Oracle.
date.toInstant()
dan Anda kebetulan bekerja dengan java.sql.Date
(anak java.util.Date
) maka Anda akan mendapatkan UnsupportedOperationException
. Cobanew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
dengan menggunakan metode konversi baru yang ditambahkan ke kelas lama itu. java.sql.Date.valueOf( myLocalDate )
dan myJavaSqlDate.toLocalDate()
Juga, driver JDBC yang diperbarui untuk JDBC 4.2 atau yang lebih baru tidak lagi memerlukan java.sql
tipe, dan dapat langsung menangani java.time
tipe melalui ResultSet::getObject
dan PreparedStatement::setObject
metode.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
tanpa alasan yang jelas ZERO berdasarkan, yaitu Januari == 0. Nah, itu didokumentasikan dengan baik di API, tetapi masih membingungkan bagi pengguna pertama kali. Saya belum menemukan orang yang bisa memberi tahu saya mengapa mereka pergi dengan itu - mungkin waktu untuk pertanyaan SO baru sendiri (meskipun saya khawatir tidak ada latar belakang yang bagus untuk itu: /)
getYear()
juga, "tanpa alasan yang jelas", dikurangi pada tahun 1900.
Jika Anda menggunakan Java 8 date api, Anda dapat langsung mendapatkannya dalam satu baris!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Atau, dengan kelas Joda-Time DateTime
.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…atau…
int month = dateTime.getMonthOfYear();
DateTime
bulan. int month = dateTime.getMonthOfYear();
.toString("MM")
karena itu menunjukkan ada lebih banyak kemungkinan daripada hanya "MM".
DateTimeZone
objek untuk yang DateTime konstruktor: DateTimeZone.forID( "America/Montreal" )
.
myUtilDate.toInstant() // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
.atZone( // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object.
ZoneId.of( "America/Montreal" ) // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMonthValue() // Extract a month number. Returns a `int` number.
java.time
DetailJawaban oleh Ortomala Lokni untuk menggunakan java.time sudah benar. Dan Anda harus menggunakan java.time karena ini merupakan peningkatan besar atas kelas java.util.Date/.Calendar lama. Lihat Tutorial Oracle di java.time.
Saya akan menambahkan beberapa kode yang menunjukkan cara menggunakan java.time tanpa memperhatikan java.util.Date, untuk saat Anda memulai dengan kode baru.
Singkatnya, menggunakan java.time ... An Instant
adalah saat di timeline di UTC. Terapkan zona waktu ( ZoneId
) untuk mendapatkan aZonedDateTime
.
The Month
kelas canggih enum untuk mewakili bulan pada umumnya. Enum itu memiliki metode praktis seperti mendapatkan nama yang dilokalkan. Dan yakinlah bahwa jumlah bulan di java.time adalah yang waras, 1-12, bukan omong kosong berbasis nol (0-11) yang ditemukan di java.util.Date/.Calendar.
Untuk mendapatkan tanggal-waktu saat ini, zona waktu sangat penting. Setiap saat, tanggalnya tidak sama di seluruh dunia. Karena itu bulannya tidak sama di seluruh dunia jika mendekati akhir / awal bulan.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth();
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
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. Spesifikasi adalah JSR 310 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlujava.sql.*
kelas.
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .
Jika Anda tidak dapat menggunakan waktu Joda dan Anda masih hidup di dunia yang gelap :) (Java 5 atau lebih rendah) Anda dapat menikmati ini:
Catatan: Pastikan tanggal Anda sudah dibuat dengan format: dd / MM / YYYY
/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
return Integer.parseInt(dateFormat.format(date));
}
/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
return Integer.parseInt(dateFormat.format(date));
}
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
Nilai yang dikembalikan dimulai dari 0, jadi Anda harus menambahkannya ke hasilnya.
new Date()
tanpa System.currentTimeMillis
. Yang lainnya adalah getMonth sudah tidak digunakan lagi.