Java8中的时间

 2023-01-30
原文作者:蒋先森 原文地址:https://jlj98.top/

相比较于之前的版本之前的版本,增加了很大新特性,其中关于时间多了很多功能:LocalDateTime,LocalDate,LocalTime。

时间介绍

LocalDate是年月日;LocalTime是时分秒;LocalDateTime则是两者的合并,可以通过下面得到:

    LocalTime localTime = LocalTime.now();
    LocalDate localDate = LocalDate.now();
    LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);

    LocalDateTime localDateTime = LocalDateTime.now();

Java8对这几个时间提供了丰富的时间计算接口。
关于Date和String之间的转化,我这里就不多说了

String –> LocalDate/LocalTime/LocalDateTime

String类型转化新特性时间可以使用 DateTimeFormatter 功能。

    DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate ld = LocalDate.parse("2017-08-01", dateformatter);
    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime ldt = LocalDateTime.parse("2017-09-22 11:30:10", df);
    String time = "11:30:10";
    DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
    LocalTime lt = LocalTime.parse(time,df);

但是在转化的时候要注意了,你不能把“2017-08-01”的String转化成LocalDateTime/LocalTime,不然会报错,需要他们代表时间的范围。

Date –> LocalDate/LocalTime/LocalDateTime

    Date date = new Date();
    Instant instant = date.toInstant();
    ZoneId zone = ZoneId.systemDefault();
    LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);//转化成LocalDateTime
    LocalDate localDate = localDateTime.toLocalDate();//转化成LocalDate
    LocalTime localTime = localDateTime.toLocalTime();//转化成LocalTime

LocalDate/LocalTime/LocalDateTime –> Date

    LocalDateTime localDateTime = LocalDateTime.now();
    ZoneId zone = ZoneId.systemDefault();
    Instant instant = localDateTime.atZone(zone).toInstant();
    Date date = Date.from(instant);
    LocalDate localDate = LocalDate.now();
    ZoneId zone = ZoneId.systemDefault();
    Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
    Date date = Date.from(instant);
    LocalTime localTime = LocalTime.now();
    LocalDate localDate = LocalDate.now();
    LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
    LocalDateTime localDateTime1 = LocalDateTime.now();
    ZoneId zone = ZoneId.systemDefault();
    Instant instant = localDateTime.atZone(zone).toInstant();
    Date date = Date.from(instant);

计算两个时间差

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime start = now.minusDays(5);
    Duration duration = Duration.between(start,now);
    System.out.println(duration.toDays());

Instant

Instant代表某个时间,类似于java.util.Date,它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用Long去表示,其中的存储空间是不够的,不能像data那样直接使用一个long类型表示时间戳。其实在Instant中,它的源码就是分成两部分组成的。

    private Instant(long epochSecond, int nanos) {
        super();
        this.seconds = epochSecond;
        this.nanos = nanos;
    }

Instant和上面介绍的时间类一样,提供了很多的方法。简单的介绍点。

    public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println(instant);
        //将java.util.Date转换为Instant
        Instant time = Instant.ofEpochMilli(new Date().getTime());
        //从字符串类型中创建Instant类型的时间
        instant = Instant.parse("1995-10-23T10:12:35Z");
        //将现在的时间加上5个小时4分钟
        instant.plus(Duration.ofHours(5).plusMinutes(4));
    }

Reference