千家信息网

如何理解Java 8中时间API

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章为大家展示了如何理解Java 8中时间API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。留意到其中Java 8预览版中将会出现新的关于日期和时间的A
千家信息网最后更新 2026年11月01日如何理解Java 8中时间API

本篇文章为大家展示了如何理解Java 8中时间API,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

留意到其中Java 8预览版中将会出现新的关于日期和时间的API(遵守JSR 310规范)。对这些新的API进行举例说明。首先先介绍以下几个:Instant,LocalDate,LocalTime和LocalDateTime。

Instant (java.time.Instant)

可能最容易开始学习java.time包中的内容的就是先来看看Instant这个类。所谓的Instant类代表的是某个时间(有点象java.util.Date),它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用纳秒去表示一个时间则原来的使用一位Long类型是不足够的,需要占用更多一点的存储空间,然而实际上其内部是由两个Long字段组成,***个部分保存的是自标准Java计算时代(就是1970年1月1日开始)到现在的秒数,第二部分保存的是纳秒数(永远不会超过999,999,999)。我们看下一个具体的例子:

  1.  //获得当前时间

  2. //获得当前时间

  3. Instant instant = Instant.now();

  4. // 以ISO-8601输出

  5. System.out.println(instant);

在Open JDK 中运行上面的代码,可以有如下格式的输出:2013-06-25T16:22:52.966Z,可以看到,输入了更为精确的日期。下面的例子是更多的关于Instant类的用法,如

//将java.util.Date转换为Instant Instant instant = Instant.ofEpochMilli(new Date().getTime()); //从字符串类型中创建Instant类型的时间 instant = Instant.parse("1995-10-23T10:12:35Z");

注意,在上面的例子中,有一个字符串中创建Instant类型的时间,但Instant代表的是一个时间,并不包括时区的概念,所以必须传入的是符合UTC格式的字符串)。Instant API也提供了一些很有用的方法允许使用Instant和其他包中的类进行一些运算,下面是例子:

instant.plus(Duration.ofHours(5).plusMinutes(4));

上面表达的含义为,将现在的时间加上5个小时4分钟。

那么这个例子中,使用了多少个java.time.Instant实例呢?答案是两个。Java.time这个包是线程安全的并且和其他大部分类一样是不可变类。Instant也遵守这个规则,因此plus方法产生一个新的实例,如:

Instant instant1 = instant.plus(Duration.ofHours(5).plusMinutes(4)); System.out.println("Instant is immutable, so instant==instant returns: " + (instant == instant1));

输出为:

Instant is immutable, so instant==instant returns: false

下面是更多关于计算的例子:

// Substract 5 days of an instant 计算5天前 instant.minus(5, ChronoUnit.DAYS); // Option 1 方法1 instant.minus(Duration.ofDays(5)); // Option 2  方法2  //计算两个Instant之间的分钟数 long diffAsMinutes = instant.periodUntil(instant1, ChronoUnit.MINUTES); // 方法1 long diffAsMinutes = ChronoUnit.MINUTES.between(instant, instant1); // 方法2

Instant是可比较的,这意味着可以对两个Instant进行比较。它提供了isAfter()和isBefore()两个方法进行比较,如下代码所示:

//用compareTo方法比较 System.out.format("instant1.compareTo(instant)=%d.%n", instant1.compareTo(instant));  // 使用isAfter()和isBefore() System.out.format("instant1.isAfter(instant)=%b, instant1.isBefore(instant)=%b.%n",   instant1.isAfter(instant), instant1.isBefore(instant))

输出结果:

instant1.compareTo(instant)=1. instant1.isAfter(instant)=true, instant1.isBefore(instant)=false

Localdate和LocalTime

LocalDate表示不带时区的日期,比如1-1-2000。LocalTime表示不带时区的时间,比如04:44:50.12,和之前提到的Instant类是从1970年计算偏移量不同,这两个类的输出是人们习惯阅读的日期和时间。有很多种方法去获得LocalTime和LocalDate的实例,如

  1. LocalDate localDate = LocalDate.now();

  2. localDate = LocalDate.ofYearDay(2005, 86); // 获得2005年的第86天 (27-Mar-2005)

  3. localDate = LocalDate.of(2013, Month.AUGUST, 10); //2013年8月10日

  4. LocalTime localTime = LocalTime.of(22, 33); //10:33 PM

  5. localTime = LocalTime.now();

  6. localTime = LocalTime.ofSecondOfDay(4503); // 返回一天中的第4503秒 (1:15:30 AM)

LocalDate和LocalTime和Instant一样遵守同样的线程规定―― 如它们的实例子都是不可变的。LocalDate和LocalTime和Instant有同样的计算和比较方法(其中有些方法是在java.time.temporal.Temporal接口中定义的,并且上面这些类都实现了这些方法):

LocalDate localDate1 = localDate.plus(5, ChronoUnit.HOURS); localDate.isBefore(localDate1);

LocalDateTime

***来看下在简单日期和时间类中最重要的一个:LocalDataTeime。它是LocalDate和LocalTime的组合体,表示的是不带时区的日期及时间。看上去,LocalDateTime和Instant很象,但记得的是"Instant中是不带时区的即时时间点。可能有人说,即时的时间点不就是日期+时间么?看上去是这样的,但还是有所区别,比如LocalDateTime对于用户来说,可能就只是一个简单的日期和时间的概念,考虑如下的例子:两个人都在2013年7月2日11点出生,***个人是在英国出生,而第二个是在加尼福利亚,如果我们问他们是在什么时候出生的话,则他们看上去都是在同样的时间出生(就是LocalDateTime所表达的),但如果我们根据时间线(如格林威治时间线)去仔细考察,则会发现在出生的人会比在英国出生的人稍微晚几个小时(这就是Instant所表达的概念,并且要将其转换为UTC格式的时间)。除此之外,LocalDateTime的用法和上述介绍的其他类都很相似,如下例子所示:

LocalDateTime localDateTime = LocalDateTime.now();  //当前时间加上25小时3分钟  LocalDateTime inTheFuture = localDateTime.plusHours(25).plusMinutes(3);  // 同样也可以用在localTime和localDate中  System.out.println(localDateTime.toLocalTime().plusHours(25).plusMinutes(3));  System.out.println(localDateTime.toLocalDate().plusMonths(2));  //  也可以使用实现TemportalAmount接口的Duration类和Period类  System.out.println(localDateTime.toLocalTime().plus(Duration.ofHours(25).plusMinutes(3))); System.out.println(localDateTime.toLocalDate().plus(Period.ofMonths(2)));

上述内容就是如何理解Java 8中时间API,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

时间 方法 例子 日期 两个 就是 时区 是在 输出 实例 更多 类型 精确 内容 字符 字符串 小时 格式 概念 纳秒 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司经营范围 互联网科技有限公司经营范围 智网互联网科技 唐信互联网科技 大连 菲比寻常互联网科技 亿人帮互联网科技 深圳卡尔迅互联网科技有限公司怎么样 中国的互联网科技企业的崛起 互联网科技公司实习生 互联网科技商业 民营互联网公司国防科技 华中科技大学互联网的牛人 互联网领先科技宣传片 互联网风格科技公司名称 工业互联网科技创业 南京一网一红互联网科技有限公司 九思连强互联网电子科技有限公司 信承诺互联网科技有限公司 陕西彩京云互联网科技有限公司 10位科技互联网大佬 广东万易互联网科技有限公司惠州分公司 高科技互联网 互联网科技卖菜 互联网医疗科技 猫创互联网科技 齐家互联网科技有限公司 互联网科技产业特征 互联网科技和法律行业 扫呗互联网科技有限公司 珠海东科互联网科技有限公司
0