为什么会在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/ShanghaiZoneOffset zoneOffset = ZoneOffset.ofHours(8);System.out.println(zoneOffset);//+08:00Instant instant = Instant.ofEpochSecond(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));System.out.println(instant.getEpochSecond());//1605596559Duration duration = Duration.between(LocalDateTime.now(), LocalDateTime.now().plusHours(1));System.out.println(duration.getSeconds());//3600Period period = Period.between(LocalDate.now(),LocalDate.now().plusDays(1));System.out.println(period.getDays());//1LocalDate date = LocalDate.now();System.out.println(date);//2020-11-17LocalTime time = LocalTime.now();System.out.println(time);//15:02:39.067LocalDateTime now = LocalDateTime.now();System.out.println(now);//2020-11-17T15:02:39.06ZonedDateTime 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:00String format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(offsetDateTime);System.out.println(format);//2020-11-17 15:02:39TemporalAdjuster 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这样的时间工具类,内置了一些方法。

sql两个时间计算时间差_Java 8时间类,越用越香相关推荐

  1. java 比较时间时分的大小_java计算时间差及比较时间大小

    java计算时间差及比较时间大小 javaz中对日期时间的处理比较多,代码中列出了3中日期时间计算差值的方法. 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11: ...

  2. java计算时间差_java中计算两个时间差

    java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...

  3. java 时间判断大小_java判断时间大小

    //构造日期格式yyyy-MM-NN SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d ...

  4. js根据一个时间计算N年后的时间-计算时间demo示例

    <!doctype html> <html lang="en"> <head><meta charset="UTF-8" ...

  5. java计算时间差_Java中计算两个日期的时间差

    这篇文章将使用两个例子计算两个日期的时间差. 1.使用Java SDK. 2.使用Joda库. 1.使用Java SDK 计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算 ...

  6. python使用datetime获取两个时间的时间差,与时间的加减运算

    设置指定日期为datatime格式:datetime(2020, 1, 1),表示2020年1月1日 设置指定的时间差:datetime.timedelta(days=2),表示两天的时间差 时间差是 ...

  7. linux c计算时间差值,获取时间和计算时间差的几种方法总结,时间差几种方法...

    获取时间和计算时间差的几种方法总结,时间差几种方法 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( ...

  8. 关于js中的时间——计算时间差等

    获取当前(系统)时间: var NowDate= new Date(); // 获取当前日期时间 // 输出为: Wed May 03 2017 14:52:08 GMT+0800 (中国标准时间) ...

  9. java 计算周_java – Joda时间周计算推理

    下面的代码演示了星期计算的有问题的joda-time实现.这种行为不是错误,而是设计决策 Joda-Time uses the ISO standard Monday to Sunday week.( ...

最新文章

  1. 【web安全】你的open_basedir安全吗?
  2. vue中axios的封装以及使用
  3. Polygonal-Light Shading with LTC
  4. 实现内、外网同时访问
  5. local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架
  6. 微信服务号+支付+php,微信服务号发送营销红包给关注用户步骤及部分php代码
  7. C# const与readonly的用法和区别解析(转)
  8. 深度学习入门笔记(五):神经网络的学习
  9. google服务框架 闪退_刷入对应谷歌服务框架之后依然闪退怎么办 解决方方攻略...
  10. 低代码指南100方案:28高效HR如何做好面试管理,提高招聘效率?
  11. 概率论由相关性求数学期望和方差的公式_概率论笔记2--离散随机变量、数学期望和方差...
  12. Hibernate源码解析
  13. android应用程序耗电,Android的十大耗电量应用程序,在软件中排名第一
  14. 服务器协议 重发 回包 039,3情报板预置播放表、位图一览表.doc
  15. 联想旗下佳沃集团拟收购智利三文鱼公司Australis Seafoods S.A.
  16. c语言程序项目设计三角函数,《C语言及程序设计》实践参考——编制三角函数表...
  17. 五个“时髦”技术被判死刑
  18. c 语言怎么实现可视化编程,自定义编程语言的实现
  19. 关于论文查重的相关知识
  20. 数据挖掘系列(1)_Excel的数据挖掘插件安装(SQL Server 2012 office )

热门文章

  1. CVPR 2019 | INIT:针对实例级的图像翻译
  2. 经典论文复现 | ICML 2017大热论文:Wasserstein GAN
  3. windows/Linux 安装 MongoDB 3.6.5
  4. 在你的计算机上使用qr码登录,如何在Android 10上使用QR码共享您的Wi-fi凭据 | MOS86...
  5. pyqt 事件更新图片显示_使用PyQTamp;树莓派制作一个天气站
  6. 两封邮件合并转发_卖家直呼!低价订单过多,listing合并竟被亚马逊封号!
  7. mysql运行报错64bit_关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法
  8. Java中有关clone方法的用法
  9. API性能优化之异步
  10. 白盒测试——简单分支函数测试