千家信息网

如何使用Java 8的时间类

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"如何使用Java 8的时间类",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用Java 8的时间类"吧!为什么会在Jdk8中加
千家信息网最后更新 2026年11月02日如何使用Java 8的时间类

这篇文章主要讲解了"如何使用Java 8的时间类",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何使用Java 8的时间类"吧!

为什么会在Jdk8中加入很多时间类

非线程安全

java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

Date date = new Date(); for (int i = 0; i < 100; i++) {     new Thread(new Runnable() {         @Override         public void run() {             // 举例             int time = new Random().nextInt(100);             date.setTime(time);             System.out.println( Thread.currentThread().getId() + " = " + time);             System.out.println( Thread.currentThread().getId() + " = " + date.getTime());         }     }).start(); }

SimpleDateFormat格式化工具也是一样,阿里巴巴规约中建议将SimpleDateFormat放到ThreadLocal中。

而java8中日期和时间基本都被设计final,final修饰的类,天然线程安全。

设计很差

java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,两个类又有相同的名字,令人匪夷所思。

java.util.Date代表时间线上的一个瞬间(包含了从Unix新纪元到现在的总毫秒数),但是如果调用了Date的toString(),返回值会提示它是带着时区的,这也会让开发者感到疑惑。

时区、日期计算处理麻烦

日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题,使用复杂,不直观

// 获取当前时间日历 +8时区 Calendar calendar = Calendar.getInstance();  // 毫秒数 calendar.setTimeInMillis(1601186434000L);  // 时区转到 utc 时间 calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); int dstOffset = calendar.get(java.util.Calendar.DST_OFFSET); int zoneOffset = calendar.get(Calendar.ZONE_OFFSET); calendar.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); // 时区转到对应的时区 calendar.setTimeZone(TimeZone.getTimeZone("GMT+5:00")); int dstOffset1 = calendar.get(java.util.Calendar.DST_OFFSET); int zoneOffset1= calendar.get(Calendar.ZONE_OFFSET); calendar.add(java.util.Calendar.MILLISECOND, (zoneOffset1 + dstOffset1));  // 时间计算 calendar.add(Calendar.HOUR,15); // 日期计算 calendar.add(Calendar.DAY_OF_MONTH, -1); // 时区计算 calendar.add(Calendar.ZONE_OFFSET, 3); // 周几 int week = calendar.get(Calendar.DAY_OF_WEEK);

基于上述的原因,java8重新提供一套时间类,下面来看一下相关类

java8 日期、时间常见类

  • ZoneId 地区 Asia/Shanghai、Europe/Paris

  • ZoneOffset 偏移数据 +8:00

  • Instant 它代表的是时间戳

  • Duration 它表示秒或纳秒时间间隔

  • Period 表示一段时间的年、月、日,开使用between()方法获取两个日期之间的差作为Period 对象返回

  • LocalDate 不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

  • LocalTime 它代表的是不含日期的时间

  • LocalDateTime 它包含了日期及时间,不过还是没有偏移信息或者说时区。

  • ZonedDateTime 这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

  • OffsetDateTime 类实际上包含了LocalDateTime与ZoneOffset

  • DateTimeFormatter 日期的格式化与解析,与SimpleDateFormat不同,它是不可变且线程安全的

  • TemporalAdjusters 类中包含许多常用的静态方法,避免自己编写工具类

时间类关系图

常见类的操作示例

ZoneId zoneId = ZoneId.systemDefault(); System.out.println(zoneId);//Asia/Shanghai  ZoneOffset zoneOffset = ZoneOffset.ofHours(8); System.out.println(zoneOffset);//+08:00  Instant instant = Instant.ofEpochSecond(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8))); System.out.println(instant.getEpochSecond());//1605596559  Duration duration = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusHours(1)); System.out.println(duration.getSeconds());//3600  Period period = Period.between(LocalDate.now(),LocalDate.now().plusDays(1)); System.out.println(period.getDays());//1  LocalDate date = LocalDate.now(); System.out.println(date);//2020-11-17  LocalTime time = LocalTime.now(); System.out.println(time);//15:02:39.067  LocalDateTime now = LocalDateTime.now(); System.out.println(now);//2020-11-17T15:02:39.06  ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), zoneId); System.out.println(zonedDateTime);//2020-11-17T15:02:39.067+08:00[Asia/Shanghai]  OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.now(), ZoneOffset.ofHours(8)); System.out.println(offsetDateTime);//2020-11-17T15:02:39.068+08:00  String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(offsetDateTime); System.out.println(format);//2020-11-17 15:02:39  TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfMonth(); System.out.println(temporalAdjuster.adjustInto(LocalDate.now()));//2020-11-01

特别说明

ZoneId、ZoneOffset主要表示时区和偏移

Instant 表示时间戳

Duration、Period 表示时间差,前者表示时间差,后者表示日期差

LocalDate、LocalTime、LocalDateTime表示日期、时间、日期+时间

ZonedDateTime、OffsetDateTime含时区信息的时间

Java8的方便之处

提供了很多时间、日期计算的方法,非常直观


也提供了TemporalAdjusters这样的时间工具类,内置了一些方法。


感谢各位的阅读,以上就是"如何使用Java 8的时间类"的内容了,经过本文的学习后,相信大家对如何使用Java 8的时间类这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

时间 日期 时区 安全 方法 线程 偏移 代表 工具 问题 学习 直观 两个 信息 内容 常见 时间差 格式 这是 可变 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 中关村互联网科技集团 互联网电商科技 互联网核心科技是什么 河南真二互联网科技有限公司 智能科技公司是互联网公司吗 互联网科技革命 狮子座互联网科技培训 金融科技与互联网金融相同和不同 电子科技大学互联网创业大赛 本届互联网博览会上的黑科技 天津腾达互联网科技有限公司 恒生互联网科技业指数调整周期 锡山区互联网智能科技产品供应 北京市互联网新科技 张召忠谈中国互联网科技 数字互联网科技有限公司 互联网科技对化妆品行业 重庆科技产业互联网有哪些 株洲百竞科技的互联网营销顾问 互联网科技 互联网科技大会 安控科技rtu产品工业互联网 河南猎农互联网科技有限公司 呼和浩特新华互联网科技学院 互联网科技公司营业执照怎么办理 厦门江牛科技互联网 东营紫格互联网科技 广州燕处互联网科技有限公司 武汉亿视互联网科技有限公司
0