Java以JDK 8为界,有两套处理日期和时间的API,分别是DateJSR 310

java.util.Date自JDK1.0就已经存在,用于表示日期+时间的类型,虽然年代十分久远,并且此类具有的职责不单一,使用很不方便等诸多毛病,但因为时间久远,它的生命力依旧顽强,用户量庞大。

简单说几个Date的缺点:

  1. 定义不一致,在java.util和java.sql都有Date类,而且对它进行格式化/解析类又跑到了java.text中去了。

  2. java.util.Date等类在建模日期的设计上行为不一致,缺陷明显。包括易变性、糟糕的偏移值、默认值、命名等。

  3. java.util.Date同时包含日期和时间,而其子类java.sql.Date却仅仅包含日期。

  4. 国际化支持的并不是很好,比如跨时区操作,夏令时等。

14年随着Java 8的发布引入了全新的JSR 310日期时间。JSR 310源于joda-time打造,解决了诸多问题,是整个Java 8的最大亮点之一。

JSR 310日期时间所有的API都在java.time包中,没有例外。

时区/偏移量ZoneId

在JDK 8之前,Java使用java.util.TimeZone来表示时区。而在JDK 8之后分别使用了ZoneId表示时区,ZoneOffset表示UTC的偏移量。时区和偏移量在概念和实际作用上是有较大的区别的:

  1. UTC偏移量仅仅是记录了偏移的小时分钟而已,除此之外并无其他任何信息。举个栗子:+8:00的意思就是比UTC时间早8小时,没有地理/时区的含义。

  2. 时区是特定与地区而言的,它和地理上的地区绑定在一起。比如整个中国都叫东八区。

中国没有夏令时,所有东八区对应的偏移量永远都是+8;纽约有夏令时,因此它的偏移量可能是-4或-5。

因为有着夏令时的存在,所以时区更好用。夏令时的问题,如果是用偏移量表示就会很麻烦,因为夏令时是可变的;用ZoneId时区去表示就很方便,因为时区内置了对夏令时规则的处理,在任何时候获取当地的时间都是正确的。

ZoneId代表是个时区的ID,如Asia/Shanghai。它规定了一些规则可用于将一个Instant时间戳转换为本地日期/时间LocaleDateTime。

JSR 310时区相关性

java.util.Date类型它具有时区无关性,带来的弊端就是一旦涉及到国际化时间转换等需求时,使用Date来处理很不方便。

JSR 310解决了Date存在的一系列问题:对日期、时间进行了分开表示(LocalDate,LocalTime,LocalDateTime),对本地时间和带时区的时间进行了分开管理。LocalXXX表示本地时间,也就是当前JVM所在的时区的时间,ZonedXXX表示的是一个带有时区的日期时间,它们能非常方便的互相完成转换。

读取字符串为JSR 310类型

一个独立的日期时间类型字符串如2021-06-27T09:20它是没有任何意义的,因为没有时区无法确定它代表哪个瞬间。

遇到一个日期时间格式字符串,要解析它一般有两种情况:

  1. 不带时区/偏移量的字符串:要么不理会说转换不了,要么约定一个时区(一般使用默认时区),使用LocalDateTime解析。

  2. 带时区的字符串用ZonedDateTime解析,带偏移量的字符串用OffsetDateTime解析。注意:有可能字符串参数偏移量为-05:00,转换为ZonedDateTime后偏移量就为-4:00,这是由于夏令时的缘故。

JSR 310格式化

针对JSR 310日期时间的格式化/解析,有一个专门的类java.time.format.DateTimeFormatter用于处理。DateTimeFormatter是一个不可变的类,所以线程是安全的,它还内置了许多格式化模板实例供使用。

想更加深入的了解,请看大佬文章:

全网最全!彻底弄透Java处理GMT/UTC日期时间 - YourBatman - 博客园 (cnblogs.com)

JSR 310日期时间API相关推荐

  1. 一文告诉你Java日期时间API到底有多烂

    前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...

  2. jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

    jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...

  3. JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

    借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(例如我目前在我的当前项目中),有很好的反向移植,请访问www.threeten.org了解更 ...

  4. 6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  5. java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  6. java8日期加本地,日期时间API(JDK8新增)

    日期时间API(JDK8新增) JDK8出现之前 JDK8新时间日期API LocalDate.LocalTime.LocalDateTime 的使用 类似于Calendar LocalDateTim ...

  7. java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...

    通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...

  8. java8 日期api_我们多么想要新的Java日期/时间API?

    java8 日期api 当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投 ...

  9. 我们多么想要新的Java日期/时间API?

    当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投了赞成票,绝大多数人回答 ...

最新文章

  1. ToString 的几个思考
  2. 中科视拓开源SeetaFace2
  3. 直线矩阵数学之路(2)-四大神器-R(18)
  4. Coursera课程Python for everyone:chapter6
  5. 常见浏览器兼容性问题与解决方式
  6. Android短视频中如何实现720P磨皮美颜录制?
  7. SpringMVC获取请求参数-基本类型
  8. Jquery屏蔽回车键
  9. MVC中使用KindEditor
  10. install mysql 5.6.22 source code
  11. 牛客2022年除夕AK场
  12. java常用省份合集
  13. 教你如何解决SQL server中提示对象名无效
  14. 三重积分(Triple Integral)
  15. Kubernetes Ingress
  16. 涉密计算机打印机共享案例分析,案例教程|兼收并蓄,有线打印机无线共享实战...
  17. 电商流水的3大策略:流量、转化率、客单价
  18. 阿里云Ubuton开MCJava服务器_每小时不到1元,弹性计算服务按流量缴费
  19. 抖音运营如何提升直播间留存率(短视频老司机为您分享5个要素)
  20. #今日论文推荐# IJCAI 2022 | 求同存异:多行为推荐的自监督图神经网络

热门文章

  1. [野狐行][辅助开发系列课程][2016/4/7][门外系列更新完毕]
  2. 2018.11~2019.4马拉松训练计划
  3. python怎么检验股票日收益率_Python量化笔记-股票收益率的正态分布检验和凯利公式应用...
  4. 怎么用Photoshop做出物体的投影效果出来
  5. delphi类没有注册
  6. 10月25日lol服务器维护,《LOL》维护到几点10月25日 英雄联盟10.25维护到几点结束...
  7. python猪代码_猪圈密码python脚本实现
  8. Artifact is being deployed, please wait…
  9. HBuilderX中创建的项目在手机模拟器上面运行
  10. 闯关的lulu (有趣的规律题)