美文网首页
Java8-新的日期和时间API

Java8-新的日期和时间API

作者: Wang2Ma | 来源:发表于2020-03-30 01:52 被阅读0次

大部分Java程序员用得最多的时候就是Date,诚然,Date足够应付大部分场景。但是最不爽的就是DateFormat的线程不安全。每次在多线程场景下,我就会处于一种纠结状态,到底要用并发还是使用新的Java Api来解决这个问题。所以决定系统学习Java的日期和时间API。

Java的日期和时间API出了三个版本,如下所示,其中Date在Java1.0引进,Calendar在Java1.1引进,LoacalDate等是在Java8引进的。

  1. Date
  2. Calendar
  3. LocalDate、LocalDateTime等

Java8的时间表示主要通过四个类,LocalDate,LocalTime,LocalDateTime,Instant。他们支持很多Date没有的操作,如加一个小时等等,下面介绍其用法。

LocalDateTime

我们先看下LocalDateTime,它和Date类是最像的,可以同时表示日期(年月日)和时间(时分秒),其核心是两个字段,一个LocalDate对象和一个LocalTime对象。LocalDateTime没有public的构造函数,一般通过如下LocalDateTime.of()LocalDateTime.now()来创建,其中now()支持无参,of()需要指定参数(如年月日时分秒),也可以通过LocalDateTime.parse()解析字符串获得。下面介绍常见用法,具体看源码或者API。
代码:

import java.time.LocalDateTime;

public class LocalDateTimeTest {
    public static void main(String[] args) {
        // 通过of()和now()创建LocalDateTime对象
        LocalDateTime localDateTime1 = LocalDateTime.now();
        LocalDateTime localDateTime2 = LocalDateTime.of(2020, 4, 1, 0, 0, 0);

        // 通过LocalDate和LocalTime的toString拼接而来的,通过T分隔
        // LocalTime的秒0为时则省略
        String dateTimeStr1 = localDateTime1.toString();
        System.out.println(dateTimeStr1);
        System.out.println(localDateTime2);

        // 解析格式化的日期,比SimpleDateFormat用起来简单多了
        // 解析后用equals判断为true
        LocalDateTime localDateTime3 = LocalDateTime.parse(dateTimeStr1);
        System.out.println(localDateTime3.equals(localDateTime1));
    }
}

输出:

2020-03-29T23:39:23.744
2020-04-01T00:00
true

LocalDateTime是通过LocalDate和LocalTime对象组合的,所以他们之间有互相转换,有兴趣可以多多了解

Instant

而Instant直译"瞬时",明显它用于表达精确时间。Date可以表达到毫秒,而Instant可以表达到纳秒。可通过now,ofEpochMilli,ofEpochSecond三种方法创建
代码:

import java.time.Instant;

public class InstantTest {
    public static void main(String[] args) {
        // 当前时间
        Instant instant1 = Instant.now();
        // 指定毫秒时间戳
        Instant instant2 = Instant.ofEpochMilli(1585497442630L);
        // 指定秒级时间戳和纳秒,纳秒不传默认为0。注意第二个参数的单位是纳秒,这里用 毫秒 * 100^6
        Instant instant3 = Instant.ofEpochSecond(1585497442, 630 * 1000_000);

        System.out.println(instant1);
        System.out.println(instant2.equals(instant3));
    }
}

输出

2020-03-29T16:04:02.079Z
true

日期和时间上的操作

修改时间

LocalDateTime可以通过with开头的方法来指定年月日时分秒,如withYear将会返回一个年份不同的对象。同时还可以通过plusminus开头的方法来加减时间,这比Date好用多了。。。
代码:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class DateTimeOperateTest {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime.plusWeeks(1));

        // LocalDateTime本身是一个没有时区的概念,可以认为只是记录了年月日时分秒这几个数字
        Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        // 获取timestamp
        System.out.println(instant.toEpochMilli());
    }
}

输出:

2020-04-06T01:41:11.303
1585503671303

格式化输出和解析时间

格式化输出和解析时间算是Java程序员对时间最常见的操作了,通过java.time.format.DateTimeFormatter来实现格式化和解析,相比DateFormat而言,它是线程安全的,可以省去为DateFormat添加ThreadLocal。DateTimeFormatter内置了一些常用的日期格式

代码:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeFormatterTest {
    public static void main(String[] args) {
        // 自带的日期时间格式化器
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        // 自定义格式化器
        DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

        LocalDateTime localDateTime = LocalDateTime.now();

        String timeStr1 = localDateTime.format(dateTimeFormatter1);
        String timeStr2 = localDateTime.format(dateTimeFormatter2);
        System.out.println(timeStr1);
        System.out.println(timeStr2);

        System.out.println(LocalDateTime.parse(timeStr1, dateTimeFormatter1).equals(
                LocalDateTime.parse(timeStr2, dateTimeFormatter2)));
    }
}

输出:

2020-03-30T00:42:34.81
2020-03-30 00:42:34.810
true

相关文章

网友评论

      本文标题:Java8-新的日期和时间API

      本文链接:https://www.haomeiwen.com/subject/sexmuhtx.html