09-23
除了withAttribute详细的年月日,也可以采用通用的with方法,第一个参数是TemporalField对象,第二个参数是修改的值。它也可以操纵LocalDate对象:
LocalDate dd5 = dd.plusWeeks(1); //加一周
LocalDate dd6 = dd.minusYears(3); //减去三年
LocalDate dd7 = dd.plus(6,ChronoUnit.MONTHS); //加6月
plus和minus方法和上面的with类似,他们都声明于Temporal接口中。像LocalDate、LocalTime、LocalDateTime以及Instant这些表示日期和时间的类提供了大量的通用方法:
1、from 静态方法 依据传入的Temporal对象创建是实例
2、now 静态方法 依据系统时钟创建Temporal对象
3、of 静态方法 由Temporal对象的某个部分创建对象的实例
4、 parse 静态方法 由字符串创建Temporal对象的实例
5、atOffset 将Temporal对象和某个时区偏移相结合
6、atZone 将Temporal 对象和某个时区相结合
7、format 使用某个指定的格式将Temporal对象转换为字符串(Instant类不提供此方法)
8、get 读取Temporal对象的某一部分的值
9、minus 创建对象的一个副本,然后将当前的Temporal对象的值减去一定的时长创建该副本
10、plus 创建对象的一个副本,然后将当前Temporal对象的值加上一定的时长创建该副本
11、with 以该对象为模板,对某些状态进行修改创建该对象的副本。
TemporalAdjuster
操纵更复杂的日期,比如将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时可以使用with的重载版本,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更加灵活的处理日期。
import static java.time.temporal.TemporalAdjusters.*;
LocalDate dd = LocalDate.of(2018,8,23);
LocalDate dd1 = dd.with(dayOfWeekInMonth(2,DayOfWeek.FRIDAY)); //同一个月中,第二个星期五 2018-08-10
LocalDate dd2 = dd.with(firstDayOfMonth()); //当月的第一天 2018-08-01
LocalDate dd3 = dd.with(firstDayOfNextMonth()); //下月的第一天 2018-09-01
LocalDate dd4 = dd.with(firstDayOfNextYear()); //明年的第一天 2019-01-01
LocalDate dd5 = dd.with(firstDayOfYear()); //当年的第一天 2018-01-01
LocalDate dd6 = dd.with(firstInMonth(DayOfWeek.MONDAY)); //当月第一个星期一 2018-08-06
LocalDate dd7 = dd.with(lastDayOfMonth()); //当月的最后一天 2018-08-31
LocalDate dd8 = dd.with(lastDayOfYear()); //当年的最后一天 2018-12-31
LocalDate dd9 = dd.with(lastInMonth(DayOfWeek.SUNDAY)); //当月最后一个星期日 2018-08-26
LocalDate dd10 = dd.with(previous(DayOfWeek.MONDAY)); //将日期向前调整到第一个符合星期一 2018-08-20
LocalDate dd11 = dd.with(next(DayOfWeek.MONDAY)); //将日期向后调整到第一个符合星期一 2018-08-27
LocalDate dd12 = dd.with(previousOrSame(DayOfWeek.FRIDAY)); //将日期向前调整第一个符合星期五,如果该日期已经符合,直接返回该对象 2018-08-17
LocalDate dd13 = dd.with(nextOrSame(DayOfWeek.FRIDAY)); //将日期向后调整第一个符合星期五,如果该日期已经符合,直接返回该对象 2018-08-24
TemporalAdjuster可以进行复杂的日期操作,如果没有找到符合的预定义方法,可以自己创建一个,TemporalAdjuster接口只声明了一个方法所以他说一个函数式接口:
@FunctionalInterface
public interface TemporalAdjuster {
Temporal adjustInto(Temporal temporal);
}
这意味着TemporalAdjuster接口的实现需要定义如何将一个Temporal对象转换为另一个Temporal对象。比如设计一个NextWorkingDay类,实现计算下一个工作日,过滤掉周六和周日节假日。
public class NextWorkingDay implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
int dayToAdd = 1;
//如果当前日期 星期一到星期五之间返回下一天
if(dow == DayOfWeek.FRIDAY) dayToAdd = 3;
//如果当前日期 周六或周日 返回下周一
else if(dow == DayOfWeek.SATUR