Java 8新特性之新的日期和时间API(2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c7ea4d849be6cbb0ba2bf82b5110a5be.html