Saya mengalami masalah dengan perhitungan kapan Hari Terakhir Bulan berikutnya untuk pemberitahuan yang dijadwalkan akan dikirim.
Ini kode saya:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Inilah garis yang menyebabkan masalah yang saya yakini:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
Bagaimana saya bisa menggunakan Kalender untuk mengatur hari terakhir bulan berikutnya untuk notifikasi?
Jawaban:
Ini mengembalikan maksimum aktual untuk bulan ini. Misalnya sekarang Februari tahun kabisat, jadi mengembalikan 29 sebagai
int
.sumber
ActualMaximum
setiap kencan. Cukup putar instance kalender ke tanggal yang diperlukan sebelum menelepongetActualMaximum
. Tanggal pertama dapat diperoleh dengangetActualMinimum()
nextNotification.setReadyDateTime(nextNotifTime.getTime());
karena itu harus saya tidak melakukan ini sebagai gantinya:nextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH);
?java.time.temporal.TemporalAdjusters.lastDayOfMonth ()
Menggunakan
java.time
perpustakaan yang dibangun ke Java 8, Anda dapat menggunakanTemporalAdjuster
antarmuka. Kami menemukan sebuah implementasi siap untuk digunakan dalamTemporalAdjusters
kelas utilitas:lastDayOfMonth
.Jika Anda perlu menambahkan informasi waktu, Anda dapat menggunakan yang tersedia
LocalDate
untukLocalDateTime
konversi sepertisumber
LocalDateTime
. Kelas itu tidak memiliki konsep zona waktu atau offset-dari-UTC. Jadi itu tidak dapat menentukan kapan hari tertentu di tempat tertentu benar-benar dimulai. Kelas itu hanya berfungsi untuk 24 jam sehari, bukan hari biasa. Untuk hari nyata, menentukan zona waktu:ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;
. Beberapa hari di beberapa tempat dapat dimulai pada waktu yang berbeda, seperti 01:00, karena anomali seperti Daylight Saving Time (DST).Dan untuk mendapatkan hari terakhir sebagai objek Date:
sumber
Anda dapat mengatur kalender menjadi yang pertama bulan berikutnya dan kemudian kurangi satu hari.
Setelah menjalankan kode ini nextNotifTime akan ditetapkan ke hari terakhir bulan ini. Ingatlah bahwa jika hari ini adalah hari terakhir dalam bulan, efek bersih dari kode ini adalah bahwa objek Kalender tetap tidak berubah.
sumber
Berikut ini akan selalu memberikan hasil yang tepat:
sumber
Menggunakan
java.time
perpustakaan terbaru di sini adalah solusi terbaik:Atau, Anda dapat melakukan:
sumber
Anda juga dapat menggunakan YearMonth.
Suka:
Lihat https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--
sumber
Lihatlah
getActualMaximum(int field)
metode objek Kalender.Jika Anda menetapkan objek Kalender Anda berada di bulan yang Anda cari tanggal terakhir, maka
getActualMaximum(Calendar.DAY_OF_MONTH)
akan memberi Anda hari terakhir.sumber
sumber
Penggunaan ekstensi tanggal Kotlin menggunakan
java.util.Calendar
Anda dapat memanggil
toEndOfMonth
fungsi pada setiap objek Date likeDate().toEndOfMonth()
sumber