Java TemporalAdjusters类的示例
java.time.temporal.TemporalAdjusters类是Java 8中添加的新日期和时间API的一部分,该API提供了常见且有用的TemporalAdjusters。 Java中的TemporalAdjusters类具有许多用于修改时间对象的静态方法,即用于调整日期和时间的方法。
我们必须了解两个接口Temporal和TemporalAdjuster才能了解时间对象的整个概念。
java.time.temporal.Temporal接口
时间的是框架级别的接口,它定义对时间对象(例如日期,时间,偏移量或者它们的某种组合)的读写访问。
这是日期,时间和偏移量对象的基本接口类型,这些对象足够完整,可以使用加号和减号进行操作,因此可以访问日期/时间/偏移量信息。
下面给出了实现Temporal接口的新日期和时间API中的一些类
Instant
LocalDate
LocalDateTime
LocalTime
OffsetDateTime
OffsetTime
ZonedDateTime
因此,这些类的对象属于Temporal类型,TemporalAdjusters类的静态方法可以修改这些临时对象。
java.time.temporal.TemporalAdjuster接口
TemporalAdjuster是一个功能接口,提供用于调整时间对象的策略。该接口具有单个抽象方法AdjustInto(),它可以调整指定的时间对象。
例如
temporal = thisAdjuster.adjustInto(temporal);
但是推荐的方法是使用temporal = temporal.with(thisAdjuster);方法,而不是直接使用adjustInto()方法。
java.time.temporal.TemporalAdjusters类
TemporalAdjusters类具有许多返回TemporalAdjuster的便捷方法。下面列出了一些方法
TemporalAdjuster dayOfWeekInMonth(int ordinal,DayOfWeek dayOfWeek)–返回月份中的星期几调节器,它返回一个新的日期以及基于月份的星期几。
TemporalAdjuster firstDayOfMonth()–返回"月份的第一天"调节器,该调节器返回设置为当前月份第一天的新日期。
TemporalAdjuster firstDayOfNextMonth()–返回"下个月的第一天"调节器,它返回设置为下个月第一天的新日期。
TemporalAdjuster firstDayOfYear()–返回"一年中的第一天"调节器,该调节器返回设置为当前年第一天的新日期。
TemporalAdjuster lastDayOfMonth()–返回"月的最后一天"调节器,该调节器返回设置为当前月最后一天的新日期。
TemporalAdjuster lastDayOfYear()–返回"一年中的最后一天"调节器,该调节器返回设置为当年最后一天的新日期。
Java TemporalAdjusters示例
1.查找LocalDateTime对象的每月的第一天或者最后一天。
LocalDateTime ldt = LocalDateTime.now(); System.out.println("Current date time- " + ldt); System.out.println("First day of the month- " + ldt.with(TemporalAdjusters.firstDayOfMonth())); System.out.println("Last day of the month - " + ldt.with(TemporalAdjusters.lastDayOfMonth()));
输出:
Current date time- 2019-11-20T10:39:26.583287900 First day of the month- 2019-11-01T10:39:26.583287900 Last day of the month – 2019-11-30T10:39:26.583287900
2.查找一个LocalDate对象在每月的星期几。在示例代码中,将计算给定月份的第一个星期日和上一个星期日。
LocalDate ld = LocalDate.now(); System.out.println("Current Date - " + ld); System.out.println("First Sunday of the month - " + ld.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY))); System.out.println("Previous Sunday - " + ld.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)));
输出:
Current Date - 2019-11-20 First Sunday of the month - 2019-11-03 Previous Sunday – 2019-11-17
自定义TemporalAdjuster示例
我们可以实现自己的TemporalAdjuster来满足特定要求。假设我们要获得该月的最后一个工作日。
import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.temporal.Temporal; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; public class WorkingDayAdjuster implements TemporalAdjuster { @Override public Temporal adjustInto(Temporal temporal) { LocalDateTime ldt = LocalDateTime.from(temporal); ldt = ldt.with(TemporalAdjusters.lastDayOfMonth()); if(ldt.getDayOfWeek() == DayOfWeek.SATURDAY || ldt.getDayOfWeek() == DayOfWeek.SUNDAY) { ldt = ldt.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY)); } return temporal.with(ldt); } }
public class WorkingDay { public static void main(String[] args) { LocalDateTime ldt = LocalDateTime.now(); System.out.println("Current Date - " + ldt); System.out.println("Last working day of the month - " + ldt.with(new WorkingDayAdjuster())); } }
输出:
Current Date - 2019-11-20T11:10:48.365786300 Last working day of the month - 2019-11-29T11:10:48.365786300