Saya memiliki LocalDate yang perlu mendapatkan hari pertama dan terakhir setiap bulan. Bagaimana aku melakukan itu?
misalnya. 13/2/2014
Saya perlu mendapatkan 1/2/2014
dan 28/2/2014
dalam format LocalDate .
Menggunakan tiga kelas LocalDate.
Saya memiliki LocalDate yang perlu mendapatkan hari pertama dan terakhir setiap bulan. Bagaimana aku melakukan itu?
misalnya. 13/2/2014
Saya perlu mendapatkan 1/2/2014
dan 28/2/2014
dalam format LocalDate .
Menggunakan tiga kelas LocalDate.
Jawaban:
API dirancang untuk mendukung solusi yang sesuai dengan kebutuhan bisnis
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Namun, solusi Jon juga bagus.
YearMonth
Untuk kelengkapan, dan lebih elegan menurut saya, lihat penggunaan YearMonth
class ini.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Untuk hari pertama & terakhir bulan ini, ini menjadi:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
metode?
LocalDate
instance untuk memulai.
Jawaban Jon Skeets benar dan pantas mendapat suara positif saya, hanya menambahkan solusi yang sedikit berbeda ini untuk kelengkapan:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Jika ada yang datang mencari hari pertama bulan sebelumnya dan hari terakhir bulan sebelumnya :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
LocalDate monthstart = LocalDate.of(year,month,1);
LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);
Anda dapat mencoba ini untuk menghindari menunjukkan tanggal kustom dan jika perlu menampilkan tanggal mulai dan akhir bulan ini:
LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
System.out.println("Start of month: " + start);
System.out.println("End of month: " + end);
Hasil:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Coba ini:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);
Anda dapat menemukan keluaran yang diinginkan tetapi perlu menjaga parameter true / false untuk metode getLastDayOfMonth
parameter itu menunjukkan tahun kabisat
getLastDayOfMonth
- lihat jawaban saya untuk pendekatan yang lebih sederhana.
jika Anda ingin melakukannya hanya dengan kelas LocalDate:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);
// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
Hanya di sini untuk menunjukkan implementasi saya untuk solusi @herman
ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");
static Date firstDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}
static Date lastDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}
static LocalDate convertToLocalDateWithTimezone(Date date) {
return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
LocalDateTime
adalah kelas yang salah untuk digunakan di sini. Anda membuang informasi zona / offset yang berharga.
Date
tidak ada hubungannya dengan Pertanyaan tersebut, dan umumnya harus dihindari.
ZoneId.of("America/La_Paz")
. Untuk tanggal hari ini akan memberikan hasil yang sama, tetapi mungkin tidak untuk tanggal bersejarah atau tanggal di masa mendatang.