java打印日期序列_Java8新特性之新日期API
早期的日期 API
在早期也就是 Java 8 之前,JDK 原生比较有名的有两个类:
Date 类
Calendar 类
这两个类相对来说用起来是比较困难的,之前我们往往是用的第三方的库。
新日期 API 的引入
在我们业界来说,这两个有两个很致命的问题:
Date 类 和 Calendar 类都是线程不安全的
除非我们的实例是留在方法体内的
Calendar 类设计不太友好
比如,查第几个月是从 0 开始计数
现在呢,Java 8 引入了一些新的 API,彻底简化了这些操作。
围绕这套新的 API 有许多类,我们着重介绍如下几个:
Instant & DurationZonedDateTime & LocalDateTime
以上两个,是处理时间的关键
DateTimeFormatter
把一个时间对象序列化或者反序列化成字符串
TemporalAdjusters
更像是一个 help 类,不是一个非常核心的类
所有涉及时间的操作逻辑,我们可以主要分成如下两点:
时区的计算
时区是一个相对的概念,比如中国的时间、美国的时间是有时差的
绝对时间
从过去的某一个过去的时间点到现在总共过了多少秒或毫秒,比如 1970年1月1日 0点到现在过去了多少
我们一般以绝对时间来作为参考
我们要了解新的 API 也是从这两点出发。
Instant 类和 Duration 类
Instant 类就代表了绝对时间的概念,它能告诉你无论是哪一个国家或者是哪一个城市,我们相比地球上过去历史上的某个时间点到现在为止过去了多少时间。
1 package新日期API;2
3 importjava.time.Instant;4
5 public classNowDate {6 public static voidmain(String[] args) {7 Instant now =Instant.now();8 System.out.println("现在过去了多少秒:" + now.getEpochSecond()); //现在过去了多少秒:1613704995
9 }10 }
我们可以用 Instant 的一些 get 方法可以得到绝对时间的坐标参考,比如,我们可以测量一个函数执行花费了多少时间
1 package新日期API;2
3 importjava.time.Duration;4 importjava.time.Instant;5
6 public classInstant {7 public static void main(String[] args) throwsThrowable {8 Instant start =Instant.now();9 //执行一些逻辑
10 Thread.sleep(2000);11 Instant end =Instant.now();12
13 //和 Instant 挂钩的还有一个 Duration14 //计算这个时间持续了多久
15 Duration duration =Duration.between(start, end);16 System.out.println(duration.getSeconds());17 }18 }19
20 /**
21 输出:22 223 */
ZonedDateTime 类和 LocalDateTime 类
Instant 类代表了时间轴上的绝对时间,但是它并不是一个友好的日历时间,只能是说当前这个时间点离格林威治时间(1970年1月1日 0点)过去了多少,但是它并不能代表着今天是星期几或者几几年的几月几日。
那么我们怎么知道一个日历时间呢?
这就要涉及到 ZonedDateTime 和 LocalDateTime 这两个类,这两个时间可以理解为相对时间。
ZonedDateTime 是带时区的类,LocalDateTime 是不带时区的类。
1. ZonedDateTime 类
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6
7 public classZonedDateTime {8 public static voidmain(String[] args) {9 /**
10 * 将一个绝对的时间转换成一个与地区相关的时间11 */
12 Instant start =Instant.now();13
14 //方法一:15 //start.atZone(ZoneId.of(ZoneId))
16 ZonedDateTime zoneTime01 = start.atZone(ZoneId.of("UTC")); //Asia/Shanghai 传递即得上海的时间
17 System.out.println("atZone转成的ZonedDateTime类型的UTC时间:" +zoneTime01);18
19 //方法二:20 //ZonedDateTime.ofInstant(start, ZoneId.of(ZoneId))21 //ZoneId22 //地区id
23 ZonedDateTime dtUTC = ZonedDateTime.ofInstant(start, ZoneId.of("UTC"));24 System.out.println("ZonedDateTime转成的UTC时间:" +dtUTC);25
26 //ZoneId.of() 也不一定显示的传递一个地区字符串或者 UTC 等
27 ZonedDateTime dtSH =start.atZone(ZoneId.systemDefault());28 System.out.println("systemDefault:" +dtSH);29 }30 }31
32 /**
33 输出:34 atZone转成的ZonedDateTime类型的UTC时间:2021-02-19T03:58:22.270337800Z[UTC]35 ZonedDateTime转成的UTC时间:2021-02-19T03:58:22.270337800Z[UTC]36 systemDefault:2021-02-19T11:58:22.270337800+08:00[Asia/Shanghai]37 */
2. LocalDateTime 类
和 ZonedDateTime 类的 API 几乎是一模一样,唯一的区别就是 LocalDateTime 类是一个不带时区的。
也就是说,使用 LocalDateTime 这个类 ,你可以知道某年某月某日或某个时间,但是你不知道是属于哪个国家的,一般来说,不建议使用 LocalDateTime 。
3. 获取 ZoneId 列表
可以使用 ZoneRulesProvider.getAvailableZoneIds()获取 ZoneId 列表
1 package新日期API;2
3 importjava.time.zone.ZoneRulesProvider;4
5 public classZoneId {6 public static voidmain(String[] args) {7 System.out.println(ZoneRulesProvider.getAvailableZoneIds());8 }9 }
DateTimeFormatter 类
用于把一个时间对象序列化或者反序列化成字符串
序列化成字符串
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");14 System.out.println(df.format(dtSH));15 }16 }17
18 /**
19 输出:20 2021-02-19 13:48:5221 */
格式可以随意设置,再例如:
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");14 System.out.println(df.format(dtSH));15 }16 }17
18 /**
19 输出:20 2021/02/19 13:51:2821 */
也可以加上时区的偏移量
1 package新日期API;2
3 importjava.time.Instant;4 importjava.time.ZoneId;5 importjava.time.ZonedDateTime;6 importjava.time.format.DateTimeFormatter;7
8 public classDateTimeFormatter5 {9 public static voidmain(String[] args) {10 Instant start =Instant.now();11 ZonedDateTime dtSH = ZonedDateTime.ofInstant(start, ZoneId.of("Asia/Shanghai"));12
13 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssxx");14 String dateStr =df.format(dtSH);15 System.out.println(dateStr);16 }17 }18
19 /**
20 输出:21 2021-02-19 13:52:25+080022 */
注意:
yyyy-MM-dd HH:mm:ss 年-月-日 时:分:秒
M 大写是为了区分 "月" 和 "分"
H 大写是为了区分 12小时制和 24小时制
小写的 h 是12小时制
大写的 H 是24小时制
有时候我们会看到这样的格式:yyyy-M-d H:m:s
mm 与 m 等,它们的区别为 是否有前导零
H,m,s表示 非零开始,HH,mm,ss表示 从零开始
比如凌晨1点2分,HH:mm显示为 01:02,H:m显示为 1:2。
反序列化
我们可以使用 ZonedDateTime.parse()将一个字符串转回一个反序列化的 ZonedDateTime
1 ZonedDateTime dt =ZonedDateTime.parse(dateStr, df);2 System.out.println(dt);3
4 /**
5 输出:6 2021-02-19T14:06:35+08:007 */
TemporalAdjusters
这个类更像是一个 help 的方法,用来调整时间,比如说,我想设置一些时间,但是可能因为某些业务逻辑,想单纯的设置某些量有点困难,就可以用这个类。
可以做一些时间业务上给我们封装好的事情
例如,我们想获取下周五的日期时间
1 package新日期API;2
3 importjava.time.DayOfWeek;4 importjava.time.Instant;5 importjava.time.ZoneId;6 importjava.time.ZonedDateTime;7 importjava.time.temporal.TemporalAdjusters;8
9 public classTemporalAdjusters {10 public static voidmain(String[] args) {11 Instant now =Instant.now();12 ZonedDateTime dtSH = now.atZone(ZoneId.of("Asia/Shanghai"));13 ZonedDateTime nextFriday =dtSH.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));14 System.out.println(nextFriday);15 }16 }17
18 /**
19 输出:20 2021-02-26T14:16:04.088263300+08:00[Asia/Shanghai]21 */
各种datetime 之间的关系
java打印日期序列_Java8新特性之新日期API相关推荐
- pandas使用date_range函数生成日期序列数据、pandas将两个日期序列数据作差生成新的日期差数据列(8 days)、并提取天数数值(8)
pandas使用date_range函数生成日期序列数据.pandas将两个日期序列数据作差生成新的日期差数据列(8 days).并提取天数数值(8) 目录
- Java8新特性之新时间API
Java8新特性之新时间API 一.新时间API 1.1 之前时间API存在问题:线程安全问题.设计混乱 1.2 本地化日期时间API:LoaclDate.LocalTime.LocalDateTim ...
- ES10新特性01-ES10新特性
ES10新特性01-ES10新特性 文章目录 ES10新特性01-ES10新特性 一.Object.fromEntries 二.字符串的扩展方法-trimStart 与 trimEnd 三.数组方法扩 ...
- C++11新特性之新类型与初始化
C++11新特性之新类型与初始化 snoone | 2016-06-23 11:57 浏览量(148) 评论(0) 推荐(0) 数据 这是C++11新特性介绍的第一部分,比较简单易懂, ...
- linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍
Linus Torvalds在Linux内核邮件列表中宣布正式发布Linux Kernel 5.12版本,已提供linux-5.12.tar.xz/tar.gz下载,以下为你介绍该版本的更改.新特性及 ...
- ES7新特性01-ES7新特性
ES7新特性01-ES7新特性 文章目录 ES7新特性01-ES7新特性 includes **(幂运算) <!DOCTYPE html> <html lang="en&q ...
- java新的日期_java8你应该了解的新特性(新时间与日期API)
java8你应该了解的新特性(新时间与日期API) java8,你应该了解的新特性(新时间与日期API) 1.使用 LocalDate .LocalTime .LocalDateTime LocalD ...
- java获取时间的各种风格_Java8新特性之新日期API
早期的日期 API 在早期也就是 Java 8 之前,JDK 原生比较有名的有两个类: Date 类 Calendar 类 这两个类相对来说用起来是比较困难的,之前我们往往是用的第三方的库. 新日期 ...
- 【Java】JDK1.8新特性Date类----日期/时间改进
一.为什么我们需要新的Java日期/时间API? 1.8之前JDK自带的日期处理类非常不方便,我们处理的时候经常是使用的第三方工具包,比如commons-lang包等.不过1.8出现之后这个改观了很多 ...
最新文章
- 读书笔记——《黑客大曝光》(1/8)
- 对英文文档中的单词与词组进行频率统计
- matlab创建mat格式变量并导入数据
- strlen 与 sizeof 的区别详解
- Linux部署Node.js应用
- 安卓开发首次创建项目一直转圈_Android视频开发进阶(part3Android的Media API)
- 【TensorFlow-windows】keras接口——卷积手写数字识别,模型保存和调用
- 七、功能性组件与事件逻辑(IVX 快速开发教程)
- 在CentOS6.2下安装DNS服务软件Bind并快速配置简单实例
- Windows说明Linux分区和挂载点
- ap_invoice_distributions_all与PO表关联问题
- 短视频无水印解析网站源码
- 记一次LeetCode中文版打不开的情况
- 笔记本拨号连接网络总断
- c语言数据结构实训报告总结,数据结构实训心得
- mysql数据库select语句用法_mysql数据库select查询语句简单用法
- 电脑上总显示宽带连接服务器怎么办啊,电脑显示宽带已连接网页打不开怎么办...
- 什么是看门狗(watchdog)?看门狗有什么作用?
- Ubuntu图形界面升级方法
- 分治、CDQ分治小结
热门文章
- Android开发UI新技能,你get这个新技能了吗?(附源码详解)
- 远程抄表 服务器,远程抄表系统的数据服务器软件设计
- 冀州中学高考2021成绩查询,冀州中学2019高考喜报成绩、本一上线人数情况(
- 【conda解决】安装Torchvision后使用PIL报错,ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'
- Gis斜坡单元提取因子值
- 计算机开多位数立方根原理,开立方
- 计算机电子琴谱小星星,小星星电子琴谱
- android 手柄助手,新游手柄助手app
- 用宅购节当前哨战,京东到家为双十一暗中蓄力
- 将本地端口映射子域名