Java 8 时间 API 快速入门

Java 8 出来很久了,各位也可能已经在用了,不过其中新的时间日期 API 可能很少人用,甚至不知道怎么上手。本文快速介绍一下其中的主要的类的概念和用法。

一、时间戳 Instant

表示一个 EPOCH 时间戳(即以 0 表示 1970-01-01T00:00:00Z),精确到纳秒。 对象不包含时区信息,且值是不可变的。

虽然概念很简单,但是它可以很方便的和其他时间日期对象之间进行交互和转换。比如:

两个 可以用来构建一个时间段;

一个 加上一个时长可以得到另一个 ;

一个 加上一个时区可以得到一个 对象。

创建 Instant

首先 Instant 有下面几个常量:

表示 1970-01-01T00:00:00Z

表示 Instant 可度量的最早时间,公元前十亿年

表示 Instant 可度量的最晚时间,公元十亿年

我们也可以通过一些静态方法来创建:

表示当前时间戳

通过现有的毫秒时间戳来创建 Instant 对象

通过现有的秒时间戳来创建 Instant 对象

从 Instant 取值

对象包含两个值:秒数和纳秒数。其中秒数指的是 epoch 时间戳,而纳秒数指的是该秒内的纳秒时间。由此可知, 对象的精确度比 高到不知道哪去了。

所以从 Instant 可以取到两个值: 获取秒数部分, 获取纳秒部分。

Instant 的操作

加减: , ;

相互比较: , ;

获得时间差: 。

下面是几个例子:

将 Instant 转换成完整的时间

这部分将在后面介绍。

二、本地日期 / 本地时间 / 本地日期时间 (LocalDate/LocalTime/LocalDateTime)

表示年月日,其精确度到天。它是不包含时分秒的。

表示一天当中的时间,其精确度到纳秒。它是不包含年月日的。

既包含日期也包含时间,但是不包含时区。它实际上就是 和 的组合。

创建 LocalDate/LocalTime/LocalDateTime 对象

这三个类都有下面的几个静态方法来创建对象:

表示当前时间或日期的对象;

使用指定的值来创建;

通过解析字符串来创建。

此外一个 对象和一个 对象可以组合为一个 对象。

下面是几个例子:

此外它们还有各自的创建对象的静态方法,具体请参考 API 文档。

到了这里你可能发现 和 本质上是一样的,都表示一个全局跨度内的一个时间点。那么两者是否可以互换呢?很可惜,不能直接互换。

因为 没有带时区,而 的时间戳是统一以格林尼治时间为准的,所以相同的 在不同时区的 EPOCH 时间戳不同,转换的时候必须附加一个时区。下面是例子:

三、时长 Duration/Period

Duration 表示以秒为单位的时长,精确到纳秒。Period 表示以天为单位的时长,精确到天。

创建 Duration/Period

有三类方法可以创建时长对象:

通过指定的值来创建;

通过解析字符串来创建;

通过两个时间点来创建。

下面是几个例子:

注意时长可以为负数。

之前说过,一个 加上一个时长可以得到另一个 。下面是个例子:

时长的操作

时长与时长可以加减。例如 表示 加上一天。

一个时间点加上一个时长可以得到另一个时间点。例如 。

时长的单位

这里必须注意的一点是, 和 的值不是单个数字,而是多个单位的组合,像 是年月日的组合,比如 “1年零3个月零5天”,你不能把它看作是 (1 x 365 + 3 x 30 + 5) 天,因为这里可能有闰年和非闰年的区别。所以 是无法转换为天数的。

四、时间单位转换

当我们要具体计算两个时间点之间的秒数或天数,该怎么办呢?这里有一个叫 的类。下面是几个例子:

其实 Java 8 的这套时间 API 比之前的 Date 和 Calendar 都要好懂得多,稍微练习一下就可以运用自如。

觉得本文对你有帮助?请分享给更多人。

关注「程序员宝库」公众号,直接获取各种编程资料!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180307A12J0Z00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券