文档

Java™教程
隐藏目录
Temporal Adjuster
路径:日期 时间
课程:标准日历
章节:时间包

时间调整器

TemporalAdjuster接口位于java.time.temporal包中,提供了一些方法,接受一个Temporal值并返回一个调整后的值。这些调整器可以与任何基于时间的类型一起使用。

如果将调整器与ZonedDateTime一起使用,则会计算出一个新日期,该日期保留原始的时间和时区值。

预定义的调整器

TemporalAdjusters类(注意复数形式)提供了一组预定义的调整器,用于找到一个月的第一天或最后一天,一年的第一天或最后一天,一个月的最后一个星期三,或特定日期之后的第一个星期二等等。这些预定义的调整器定义为静态方法,并设计用于与静态导入语句一起使用。

以下示例结合使用了几个TemporalAdjusters方法和基于时间的类中定义的with方法,根据原始日期“2000年10月15日”计算出新日期:

LocalDate date = LocalDate.of(2000, Month.OCTOBER, 15);
DayOfWeek dotw = date.getDayOfWeek();
System.out.printf("%s是%s%n", date, dotw);

System.out.printf("本月的第一天: %s%n",
                  date.with(TemporalAdjusters.firstDayOfMonth()));
System.out.printf("本月的第一个星期一: %s%n",
                  date.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
System.out.printf("本月的最后一天: %s%n",
                  date.with(TemporalAdjusters.lastDayOfMonth()));
System.out.printf("下个月的第一天: %s%n",
                  date.with(TemporalAdjusters.firstDayOfNextMonth()));
System.out.printf("明年的第一天: %s%n",
                  date.with(TemporalAdjusters.firstDayOfNextYear()));
System.out.printf("本年的第一天: %s%n",
                  date.with(TemporalAdjusters.firstDayOfYear()));

这将产生以下输出:

2000-10-15是星期日
本月的第一天: 2000-10-01
本月的第一个星期一: 2000-10-02
本月的最后一天: 2000-10-31
下个月的第一天: 2000-11-01
明年的第一天: 2001-01-01
本年的第一天: 2000-01-01

自定义调整器

您也可以创建自己的自定义调整器。为此,您可以创建一个实现TemporalAdjuster接口并具有adjustInto(Temporal)方法的类。来自PaydayAdjuster示例的PaydayAdjuster类是一个自定义调整器。PaydayAdjuster根据传入的日期计算并返回下一个发薪日,假设发薪日每月两次:15号和当月的最后一天。如果计算出的日期是在周末,则使用前一个星期五。假定当前的日历年。

/**
 * adjustInto方法接受一个Temporal实例并返回一个调整后的LocalDate。
 * 如果传入的参数不是LocalDate,则抛出DateTimeException异常。
 */
public Temporal adjustInto(Temporal input) {
    LocalDate date = LocalDate.from(input);
    int day;
    if (date.getDayOfMonth() < 15) {
        day = 15;
    } else {
        day = date.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
    }
    date = date.withDayOfMonth(day);
    if (date.getDayOfWeek() == DayOfWeek.SATURDAY ||
        date.getDayOfWeek() == DayOfWeek.SUNDAY) {
        date = date.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
    }

    return input.with(date);
}

可以像预定义的adjuster一样使用adjuster,使用with方法调用。以下代码来自NextPayday示例:

LocalDate nextPayday = date.with(new PaydayAdjuster());

在2013年,6月15日和6月30日都是周末。在2013年的6月3日和6月18日分别运行NextPayday示例,得到以下结果:

给定日期:2013年6月3日
下一个发薪日:2013年6月14日

给定日期:2013年6月18日
下一个发薪日:2013年6月28日

上一页: 时态包
下一页: 时态查询