JavaFX将于下个月的第一天上市

Joe*_*Joe 2 java javafx datepicker

我试图从LocalDate对象获取下个月的第一天,但​​遇到了一些问题.

我有一个日期选择器,用户可以选择他们想要的任何日期,没有限制,我需要获得下个月的第一天,这是我想到的:

LocalDate localDate = myDatePicker.getValue();
LocalTime startTime = LocalTime.of(0, 0);

LocalDate endDate = LocalDate.of(localDate.getYear(), localDate.getMonthValue() + 1, 0);
Run Code Online (Sandbox Code Playgroud)

但是我看到选择12月份时可能会出现问题,如果发生这种情况则会发生

LocalDate.of(localDate.getYear(), localDate.getMonthValue() + 1, 0);
Run Code Online (Sandbox Code Playgroud)

应该失败,因为我将它传递给它一个月值13.现在我可以选择检查月份值是否为12月,如果是,我可以在年份中添加1并从0开始,如下所示:

if(localDate.getMonthValue() >= 12)
    LocalDate.of(localDate.getYear() + 1, 0, 0);
Run Code Online (Sandbox Code Playgroud)

但是我觉得必须有一种方法来解决这个问题.有谁知道我将13传递给LocalDate.of月值的假设是否会导致错误?如果是这样有一种方法可以做我想做的事情,看起来不那么糟糕,并使用构建方法?

Jon*_*eet 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
    }
}
Run Code Online (Sandbox Code Playgroud)


azr*_*zro 5

  1. 自定义方式:

    • .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
      
      Run Code Online (Sandbox Code Playgroud)

  1. 内置方式:

    • TemporalAdjusters.firstDayOfNextMonth()

      firstNext = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
      
      // does a temporal.with(DAY_OF_MONTH, 1).plus(1, MONTHS); operation
      
      Run Code Online (Sandbox Code Playgroud)