ฉันมี LocalDate ซึ่งจำเป็นต้องได้รับวันแรกและวันสุดท้ายของเดือน ฉันจะทำอย่างไร?
เช่น. 13/2/2014
ฉันต้องการรับ1/2/2014
และ28/2/2014
ในรูปแบบLocalDate
ใช้คลาส LocalDate ที่สาม
ฉันมี LocalDate ซึ่งจำเป็นต้องได้รับวันแรกและวันสุดท้ายของเดือน ฉันจะทำอย่างไร?
เช่น. 13/2/2014
ฉันต้องการรับ1/2/2014
และ28/2/2014
ในรูปแบบLocalDate
ใช้คลาส LocalDate ที่สาม
คำตอบ:
เพียงใช้withDayOfMonth
และlengthOfMonth()
:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.lengthOfMonth());
API ออกแบบมาเพื่อรองรับโซลูชันที่ตรงกับความต้องการทางธุรกิจอย่างใกล้ชิด
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
อย่างไรก็ตามวิธีแก้ปัญหาของจอนก็ใช้ได้เช่นกัน
YearMonth
เพื่อความสมบูรณ์และสง่างามยิ่งขึ้นในความคิดของฉันโปรดดูการใช้YearMonth
คลาสนี้
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
สำหรับวันแรกและวันสุดท้ายของเดือนปัจจุบันจะกลายเป็น:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
วิธีการคืออะไร?
LocalDate
อินสแตนซ์เพื่อเริ่มต้นด้วย
คำตอบของ Jon Skeets นั้นถูกต้องและสมควรได้รับการโหวตเพิ่มของฉันเพียงแค่เพิ่มโซลูชันที่แตกต่างกันเล็กน้อยเพื่อความสมบูรณ์:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
หากใครมาหาวันแรกของเดือนก่อนหน้าและวันสุดท้ายของเดือนก่อนหน้า :
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);
คุณสามารถลองวิธีนี้เพื่อหลีกเลี่ยงการระบุวันที่ที่กำหนดเองและหากจำเป็นต้องแสดงวันที่เริ่มต้นและวันที่สิ้นสุดของเดือนปัจจุบัน:
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);
ผลลัพธ์:
> Start of month: 2019-12-01
> End of month: 2019-12-30
ลองสิ่งนี้:
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);
คุณสามารถค้นหาผลลัพธ์ที่ต้องการได้ แต่ต้องดูแลพารามิเตอร์true / falseสำหรับเมธอดgetLastDayOfMonth
พารามิเตอร์นั้นหมายถึงปีอธิกสุรทิน
getLastDayOfMonth
- ดูคำตอบของฉันสำหรับแนวทางที่ง่ายกว่า
หากคุณต้องการทำเฉพาะกับ LocalDate-class:
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);
ที่นี่เพื่อแสดงการใช้งานโซลูชัน @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
เป็นคลาสผิดที่จะใช้ที่นี่ คุณกำลังทิ้งข้อมูลโซน / ออฟเซ็ตที่มีค่า
Date
ไม่มีส่วนเกี่ยวข้องกับคำถามและโดยทั่วไปควรหลีกเลี่ยง
ZoneId.of("America/La_Paz")
สำหรับโซนเวลาลาปาซกรุณาใช้ที่ถูกต้องมากขึ้น สำหรับวันที่ปัจจุบันจะให้ผลลัพธ์เช่นเดียวกัน แต่อาจไม่ใช่สำหรับวันที่ในประวัติศาสตร์หรือวันที่ในอนาคตข้างหน้า