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日