JSR 310日期时间API
Java以JDK 8为界,有两套处理日期和时间的API,分别是
Date
和JSR 310
。
java.util.Date自JDK1.0就已经存在,用于表示日期+时间的类型,虽然年代十分久远,并且此类具有的职责不单一,使用很不方便等诸多毛病,但因为时间久远,它的生命力依旧顽强,用户量庞大。
简单说几个Date的缺点:
定义不一致,在java.util和java.sql都有Date类,而且对它进行格式化/解析类又跑到了java.text中去了。
java.util.Date等类在建模日期的设计上行为不一致,缺陷明显。包括易变性、糟糕的偏移值、默认值、命名等。
java.util.Date同时包含日期和时间,而其子类java.sql.Date却仅仅包含日期。
国际化支持的并不是很好,比如跨时区操作,夏令时等。
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的偏移量。时区和偏移量在概念和实际作用上是有较大的区别的:
UTC偏移量仅仅是记录了偏移的小时分钟而已,除此之外并无其他任何信息。举个栗子:+8:00的意思就是比UTC时间早8小时,没有地理/时区的含义。
时区是特定与地区而言的,它和地理上的地区绑定在一起。比如整个中国都叫东八区。
中国没有夏令时,所有东八区对应的偏移量永远都是+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它是没有任何意义的,因为没有时区无法确定它代表哪个瞬间。
遇到一个日期时间格式字符串,要解析它一般有两种情况:
不带时区/偏移量的字符串:要么不理会说转换不了,要么约定一个时区(一般使用默认时区),使用LocalDateTime解析。
带时区的字符串用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相关推荐
- 一文告诉你Java日期时间API到底有多烂
前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...
- jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...
- JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(例如我目前在我的当前项目中),有很好的反向移植,请访问www.threeten.org了解更 ...
- 6 日期字符串转日期_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- java8日期加本地,日期时间API(JDK8新增)
日期时间API(JDK8新增) JDK8出现之前 JDK8新时间日期API LocalDate.LocalTime.LocalDateTime 的使用 类似于Calendar LocalDateTim ...
- java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- java8 日期api_我们多么想要新的Java日期/时间API?
java8 日期api 当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投 ...
- 我们多么想要新的Java日期/时间API?
当前的Java.net 民意测验问题是:" 对于用Java 8实现的JSR-310(新的日期和时间API)有多重要? "在我撰写本文时,将近150位受访者投了赞成票,绝大多数人回答 ...
最新文章
- ToString 的几个思考
- 中科视拓开源SeetaFace2
- 直线矩阵数学之路(2)-四大神器-R(18)
- Coursera课程Python for everyone:chapter6
- 常见浏览器兼容性问题与解决方式
- Android短视频中如何实现720P磨皮美颜录制?
- SpringMVC获取请求参数-基本类型
- Jquery屏蔽回车键
- MVC中使用KindEditor
- install mysql 5.6.22 source code
- 牛客2022年除夕AK场
- java常用省份合集
- 教你如何解决SQL server中提示对象名无效
- 三重积分(Triple Integral)
- Kubernetes Ingress
- 涉密计算机打印机共享案例分析,案例教程|兼收并蓄,有线打印机无线共享实战...
- 电商流水的3大策略:流量、转化率、客单价
- 阿里云Ubuton开MCJava服务器_每小时不到1元,弹性计算服务按流量缴费
- 抖音运营如何提升直播间留存率(短视频老司机为您分享5个要素)
- #今日论文推荐# IJCAI 2022 | 求同存异:多行为推荐的自监督图神经网络
热门文章
- [野狐行][辅助开发系列课程][2016/4/7][门外系列更新完毕]
- 2018.11~2019.4马拉松训练计划
- python怎么检验股票日收益率_Python量化笔记-股票收益率的正态分布检验和凯利公式应用...
- 怎么用Photoshop做出物体的投影效果出来
- delphi类没有注册
- 10月25日lol服务器维护,《LOL》维护到几点10月25日 英雄联盟10.25维护到几点结束...
- python猪代码_猪圈密码python脚本实现
- Artifact is being deployed, please wait…
- HBuilderX中创建的项目在手机模拟器上面运行
- 闯关的lulu (有趣的规律题)