我正在尝试从LocalDate对象获取下个月的第一天,但遇到了一些问题。
我有一个日期选择器,用户可以不受限制地选择他们想要的任何日期,而我需要获得下个月的第一天,这是我考虑过的事情:
LocalDate localDate = myDatePicker.getValue();
LocalTime startTime = LocalTime.of(0, 0);
LocalDate endDate = LocalDate.of(localDate.getYear(), localDate.getMonthValue() + 1, 0);
但是,我看到选择12月时可能会出现问题,如果发生的话,则致电
LocalDate.of(localDate.getYear(), localDate.getMonthValue() + 1, 0);
应该失败,因为我将月份值传递给了13。现在我可以选择检查月份值是否为12月,如果可以,可以将年份加1并从0开始,如下所示:
if(localDate.getMonthValue() >= 12)
LocalDate.of(localDate.getYear() + 1, 0, 0);
但是我觉得必须在课堂上解决这个问题。有人知道我的关于将13传递给LocalDate.of month值的假设是否会导致错误吗?如果是这样,有没有一种方法可以做我想做的事情,看起来还不错,可以使用内置方法?
答案 0 :(得分:6)
幸运的是,Java通过调节器和TemporalAdjusters.firstDayOfNextMonth()
的思想使真正变得容易:
import java.time.*;
import java.time.temporal.*;
public class Test {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2018, 12, 3);
LocalDate date2 = date1.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println(date2); // 2019-01-01
}
}
答案 1 :(得分:4)
自定义方式:
.plusMonths(1)
以获取下个月 .withDayOfMonth(1)
来获得第一天
LocalDate localDate = LocalDate.of(2018, 12, 15);
LocalDate firstNext = localDate.plusMonths(1).withDayOfMonth(1);
// or firstNext = localDate.withDayOfMonth(1).plusMonths(1);
System.out.println(firstNext); //2019-01-01
内置方式:
TemporalAdjusters.firstDayOfNextMonth()
firstNext = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
// does a temporal.with(DAY_OF_MONTH, 1).plus(1, MONTHS); operation
答案 2 :(得分:4)
使用LocalDate
可以通过firstDayofNextMonth
获得TemporalAdjusters.firstDayOfNextMonth()
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class Test {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalDate firstDayOfNextMonth = date.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println(firstDayOfNextMonth);
}
}