所经历的描述进行计算。
可以使用静态工厂方法ofEpochSecond传递一个代笔哦啊秒数的值创建一个该类的实例。这个方法还有一个重载版本,它接受第二个以纳秒为单位的参数值,对传入作为秒数的参数进行调整。重载的版本会调整纳秒参数,确保保存的纳秒分片在0到999999999之间,这意味着下面这些对ofEpochSecond工厂方法的调用返回几乎同样的Instant对象:
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-