Java教程是针对JDK 8编写的。本页中描述的示例和实践未利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及后续版本中更新的语言特性摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或不推荐选项的信息。
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日