Instant instant = Instant.ofEpochSecond(3);
Instant instant2 = Instant.ofEpochSecond(3, 0);
Instant instant3 = Instant.ofEpochSecond(2, 1_000_000_000);
Instant instant4 = Instant.ofEpochSecond(4, -1_000_000_000);
1970-01-01T00:00:03Z
Instant类也支持静态工厂方法now,它能够帮你获取当前时刻的时间戳。Instant的设计初衷是为了便于机器使用,它所包含的是由秒及纳秒所构成的数字。所以,它无法处理那些我们非常容易理解的时间单位。
定义Duration或Period
计算日期时间差使用这两个类
Duration d1 = Duration.between(time1, time2);
Duration d2 = Duration.between(datetime1, datetime2);
Duration d3 = Duration.between(instant,instant2);
由于LocalDateTime和Instant是为不同的目的而设计的,一个是为了人阅读的,一个是为了机器处理的,所以不能将二者混用。此外,由于Duration类主要用于以秒和纳秒衡量时间的长短,所以不能向between方法传递LocalDate。
Duration和Period类都提供了很多非常方便的工厂类,直接创建对应的实例。
Duration threeMinutes = Duration.ofMinutes(3);
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
Period tenDays = Period.ofDays(10);
Period threeWeeks = Period.ofWeeks(3);
Period twoYearsSixMothsOneDay = Period.of(2,6,1);
Period计算时间差
LocalDate today = LocalDate.now();
System.out.println("Today : " + today);
LocalDate birthDate = LocalDate.of(1991, 1, 11);
System.out.println("BirthDate : " + birthDate);
Period p = Period.between(birthDate, today);
System.out.printf("年龄 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());
Today : 2018-08-22
BirthDate : 1991-01-11
年龄 : 27 年 7 月 11 日
Duration计算相差秒数
Instant inst1 = Instant.now();
System.out.println("Inst1 : " + inst1);
Instant inst2 = inst1.plus(Duration.ofSeconds(10));
System.out.println("Inst2 : " + inst2);
System.out.println("Difference in milliseconds : " + Duration.between(inst1, inst2).toMillis());
System.out.println("Difference in seconds : " + Duration.between(inst1, inst2).getSeconds());
Difference in milliseconds : 10000
Difference in seconds : 10
到目前为止,这些日期和时间都是不可修改的,这是为了更好的支持函数式编程,确保线程安全。如果你想在LocalDate实例上增加3天,或者将日期解析和输入 dd/MM/yyyy这种格式。 将在下一节讲解。
操作、解析和格式化日期
对已存在的LocalDate对象,创建它的修改版,最简单的方式是使用withAttribute方法。withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。以下所有的方法都返回了一个修改属性的对象,他们不会影响原来的对象。
LocalDate dd = LocalDate.of(2018,8,23); //2018-08-23
LocalDate dd1 = dd.withYear(2017); //2017-08-23
LocalDate dd2 = dd.withDayOfMonth(22); //2018-08-22
LocalDate dd4 = dd.withMonth(10); //2018-10-23
LocalDate dd3 = dd.with(ChronoField.MONTH_OF_YEAR,9); //2018-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