Tôi có LocalDate cần lấy ngày đầu tiên và ngày cuối cùng của tháng. Làm thế nào để làm điều đó?
ví dụ. 13/2/2014
Tôi cần lấy 1/2/2014
và 28/2/2014
ở định dạng LocalDate .
Sử dụng lớp LocalDate threeten.
Tôi có LocalDate cần lấy ngày đầu tiên và ngày cuối cùng của tháng. Làm thế nào để làm điều đó?
ví dụ. 13/2/2014
Tôi cần lấy 1/2/2014
và 28/2/2014
ở định dạng LocalDate .
Sử dụng lớp LocalDate threeten.
Câu trả lời:
API được thiết kế để hỗ trợ một giải pháp phù hợp chặt chẽ với các yêu cầu kinh doanh
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Tuy nhiên, các giải pháp của Jon cũng ổn.
YearMonth
Để hoàn thiện và trang nhã hơn theo quan điểm của tôi, hãy xem cách sử dụng YearMonth
lớp này.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Đối với ngày đầu tiên và ngày cuối cùng của tháng hiện tại, điều này sẽ trở thành:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
phương pháp là gì?
LocalDate
phiên bản để bắt đầu.
Câu trả lời của Jon Skeets là đúng và xứng đáng nhận được sự ủng hộ của tôi, chỉ cần thêm giải pháp hơi khác này để hoàn thiện:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Nếu ai đó đến tìm kiếm ngày đầu tiên của tháng trước và ngày cuối cùng của tháng trước :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
Bạn có thể thử điều này để tránh chỉ ra ngày tùy chỉnh và nếu cần hiển thị ngày bắt đầu và ngày kết thúc của tháng hiện tại:
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);
Kết quả:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Thử cái này:
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);
bạn có thể tìm thấy đầu ra mong muốn nhưng cần quan tâm đến tham số true / false cho phương thức getLastDayOfMonth
tham số đó biểu thị năm nhuận
getLastDayOfMonth
- hãy xem câu trả lời của tôi để biết cách tiếp cận đơn giản hơn.
nếu bạn chỉ muốn làm điều đó với lớp 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);
Chỉ ở đây để hiển thị cách triển khai của tôi cho giải pháp @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
chính xác là lớp sai được sử dụng ở đây. Bạn đang loại bỏ thông tin vùng / bù đắp có giá trị.
Date
không liên quan gì đến Câu hỏi, và thường nên tránh.
ZoneId.of("America/La_Paz")
. Đối với các ngày hiện tại, nó sẽ cho kết quả tương tự, nhưng có thể không cho các ngày lịch sử hoặc các ngày trong tương lai xa hơn.