・所有的java.time对象都是不可变的
・一个瞬间(Instant)是时间线上的一个点
・在Java事件中,每天都是86400秒
・持续时间(Duration)是两个瞬间之间的时间
・LocalXXX 没有时区信息
・TemporalAdjuster可以处理常用日历计算美丽如找到某个月的第一个星期二
1.时间线
Instant对象为时间轴上的一个点,原点为1970.1.1日午夜
Duration表示两个瞬时点之间的时间量。
两者提供多个plus/minus/multipliedBy/dividedBy方法以供计算
也可以使用toNano方法以long值进行计算
保存Api链接随时查阅:
Instant https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
Duration https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html
2.本地日期
在新的Java API中,包含两种人类时间:本地日期/带时区的日期
由于有些操作不需要时区,或者为了排除夏令时等的影响,使用本地日期进行计算更为适合
LocalDate包含年月日的信息:
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1991,2,3);
LocalDate birthday = LocalDate.of(1991, Month.JUNE, 14);
LocalDate:https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
两个Instant之间的距离是Duration,对于本地日期,两个LocalDate之间的距离就是Period(时段)
Period: https://docs.oracle.com/javase/8/docs/api/java/time/Period.html
例如增加一年的时间,如果使用day.plus(Duration.ofDays(365))在闰年的时候便会错误,正确的方法是birthday.plusYear(1)或者birthday.plus(Period.ofYear(1))
注意:LocalDate的getDayOfWeek与Calendar不同,周一为1,周日为7(Calendar周日为1,周六为7)
3.日期校正器
TemporalAdjuster提供许多静态方法进行常用校正。
例如将校正方法的结果传递给LocalDate的with方法,计算某个月的第一个周二
LocalDate.of(year, month, 1).with(TemporalAdjuster.nextOrSame(DayOfWeek.TUESDAY));
也可以实现TemporalAdjuster接口创建自己的校正
TemporalAdjuster NEXT_WORKDAY =TemporalAdjusters.ofDateAdjuster(w -> {
LocalDate = result =w;
// 计算日期..
return result;
});
TemporalAdjuster: https://docs.oracle.com/javase/jp/8/docs/api/java/time/temporal/TemporalAdjusters.html
4.本地时间
与本地日期相对,LocalTime表示一天中某个时间。LocalDateTime表示一个日期和时间
LocalTime.now()
LocalTime.of(22,30)
LocalTime.of(22,30, 10);
LocalTime: https://docs.oracle.com/javase/8/docs/api/java/time/LocalTime.html
LocalDateTime:https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html
5.带时区的时间
每个时区都有一个ID,比如America/New_York。想要获得所有时区可以调用ZoneId.getAvailableIds
根据指定的id,ZoneId.of(id)会返