网站首页 > 技术文章 正文
JAVA8时间工具类转换
在JDK1.8以前时间工具类一般都是Date、Calendar、SimpleDateFormat等,这些工具类使用相对繁琐,而且线程不安全,所以在JDK1.8对日期类做了重新规划,解决工具类线程不安全问题,而且提升了性能,部分工具类展示如下。
- LocalDate:本地日期,不包含具体时间,所以时间格式为yyyy-MM-dd。
- LocalTime:本地时间,不包含日期。
- LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
- ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
在我们开发过程中或多或少都会遇到需要兼容之前的旧代码,所以这篇文章主要记录这些工具类之间的相互转换。
LocalDateTime转LocalDate、转LocalTime
LocalDateTime工具类中包含了时间和日期,所以这个转换相对简单。
// LocalDateTime转LocalDate、转LocalTime
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDate localDate1 = localDateTime1.toLocalDate();
LocalTime localTime1 = localDateTime1.toLocalTime();
LocalDateTime转Date
LocalDateTime不能直接转换为Date对象,需要通过桥梁ZonedDateTime,也就是带了时区的日期类,这里的转换涉及到两个类
- ZoneId:时区类。
- Instant:记录瞬时时间,也就是时间戳(类似于System.currentTimeMillis()方法)。
// LocalDateTime转Date
// 将localDateTime1先转换为带时区的工具类ZonedDateTime(需要指定时区,一般采用系统默认时区即可)
ZonedDateTime zonedDateTime = localDateTime1.atZone(ZoneId.systemDefault());
// 将时区时间工具类,转换为时间戳
Instant instant = zonedDateTime.toInstant();
Date date = Date.from(instant);
LocalDate、LocalTime转LocalDateTime
LocalDate和LocalTime其实都是残缺的时间类(缺少时间或者日期),所以在转换为完整时间时需要将缺少的时间或日期补全。
// LocalDate转LocalDateTime
LocalDate localDate2 = LocalDate.now();
// 补齐时、分、秒
LocalDateTime localDateTime3 = localDate2.atTime(10, 10, 10);
// LocalTime转LocalDateTime
LocalTime localTime4 = LocalTime.now();
// 补齐年、月、日
LocalDateTime localDateTime2 = localTime4.atDate(localDate2);
LocalDate转Date
LocalDate转Date日期同样需要借助ZonedDateTime类
// LocalDate转Date
LocalDate localDate3 = LocalDate.now();
ZonedDateTime zonedDateTime1 = localDate3.atStartOfDay(ZoneId.systemDefault());
Instant instant1 = zonedDateTime1.toInstant();
Date date1 = Date.from(instant1);
Date转LocalDate、LocalDateTime、LocalTime
Date转JAVA8相关时间工具类全部以ZonedDateTime为媒介即可,这里转换相当于LocalDateTime转Date对象的一个逆向过程
// Date转LocalDate
Date date2 = new Date();
Instant instant2 = date2.toInstant();
ZonedDateTime zonedDateTime2 = instant2.atZone(ZoneId.systemDefault());
LocalDate localDate = zonedDateTime2.toLocalDate();
// Date转LocalDateTime
LocalDateTime localDateTime = zonedDateTime2.toLocalDateTime();
// Date转LocalTime
LocalTime localTime = zonedDateTime2.toLocalTime();
总结
转换过程总结起来相对简单,Date类和JDK1.8推出的LocalDate、LocalDateTime、LocalTime类之间的转换可以通过ZonedDateTime做桥梁,至于JDK1.8新出的类就可以通过API自己转换,转换细节如图所示
- 上一篇: 100个Java工具类之3:获取多种日期格式
- 下一篇: 一些长时间GC停顿问题的排查及解决办法
猜你喜欢
- 2024-10-22 DATE #4、Java操作日期时间-②老版本使用的日期和时间类
- 2024-10-22 JDK1.7和JDK1.8中日期时间使用和处理的不同「Java工程师必读」
- 2024-10-22 浅谈Java8日期时间处理(抗美援朝战争时间的起止日期)
- 2024-10-22 玩转MySQL的时间类型:Date、DateTime、TimeStamp、Time
- 2024-10-22 Java8日期时间类使用详解,干货满满,不容错过哦
- 2024-10-22 java 8 新特性 日期和时间 API(我的世界java版特性)
- 2024-10-22 JAVA时间工具包 - java.time(java中时间)
- 2024-10-22 Java 打印日期/时间格式(java 打印当前时间)
- 2024-10-22 Java时间类Date与Calendar的区别与使用
- 2024-10-22 用python 计算两个日期相差多少个月
- 1507℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 505℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 484℃MySQL service启动脚本浅析(r12笔记第59天)
- 465℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 462℃启用MySQL查询缓存(mysql8.0查询缓存)
- 442℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 422℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 418℃MySQL server PID file could not be found!失败
- 最近发表
-
- netty系列之:搭建HTTP上传文件服务器
- 让deepseek教我将deepseek接入word
- 前端大文件分片上传断点续传(前端大文件分片上传断点续传怎么操作)
- POST 为什么会发送两次请求?(post+为什么会发送两次请求?怎么回答)
- Jmeter之HTTP请求与响应(jmeter运行http请求没反应)
- WAF-Bypass之SQL注入绕过思路总结
- 用户疯狂点击上传按钮,如何确保只有一个上传任务在执行?
- 二 计算机网络 前端学习 物理层 链路层 网络层 传输层 应用层 HTTP
- HTTP请求的完全过程(http请求的基本过程)
- dart系列之:浏览器中的舞者,用dart发送HTTP请求
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)