LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项
一、前言
大家在开发过程中必不可少的和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转化!
每次写完就忘记了,小编专门来整理一篇来详细说一下他们四个的转换的方法,方便后面使用!!
二、LocalDateTime、LocalDate、Date三者联系
这里先说一下,为什么日期有Date了,还在JDK8中推出了LocalDateTime、LocalDate呢?
原因Date:
非线程安全的方法
Date类的大部分方法都不是线程安全的,比如
setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds()等方法。这些方法都可以修改Date对象的内部状态。如果多个线程同时访问和修改同一个Date对象,就会发生竞态条件,导致程序出现错误的结果。全局变量的使用
Date类有两个静态变量,分别是
DateParser和CalendarSystem。这两个变量是全局共享的,如果多个线程同时访问和修改这两个变量,也会导致程序出现竞态条件。
因此,如果需要在线程中使用日期时间相关的操作,建议使用线程安全的日期时间类,比如JDK8中引入的新日期时间API中的LocalDateTime、LocalDate等类,或者使用线程安全的DateFormat和Calendar类。
我们在说一下LocalDateTime他们是怎么实现线程安全的:
LocalDateTime它是由LocalDate和LocalTime两个不可变的类组成的。LocalDate和LocalTime各自都是线程安全的,它们的时间信息都是基于UTC(协调世界时)计算的,并且不依赖于系统的时区设置。LocalDateTime也是一样,它是由系统时区和UTC计算得到的。
有兴趣的可以看一下:协调世界时介绍
这些类主要是使用了以下两个技术来解决线程安全问题:
不可变性:这些类都是不可变的,一旦创建后,就不能再被修改。因此,就不存在并发修改的问题了。
线程封闭性:这些类的构造方法都是线程安全的,并且不允许外部修改其中的状态。因此,就不需要通过锁或其他机制来保护它们的状态。
综上所述,Java 8中的新日期时间API通过不可变性和线程封闭性等技术,有效地解决了线程安全问题。这使得开发者们可以更加安全和便利地在多线程环境下使用日期时间类。
基本上新的系统都会使用LocalDateTime来作为日期时间,减少并发问题!
三、相互转换例子
1. LocalDate转String
LocalDate类有一个format()方法,可以将日期转成字符串。format()方法需要一个DateTimeFormatter对象作为参数。以下代码示例中,我们将日期对象转换为字符串。
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println("当前字符串日期:" + dateStr);
2. String转LocalDate
我们可以使用parse()方法从字符串中解析日期对象
LocalDate date = LocalDate.parse(dateStr);
System.out.println("日期对象:" + date);

3. LocalDateTime转String
同样,我们可以使用DateTimeFormatter类将LocalDateTime类型的日期对象格式化为字符串。
String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当前字符串日期时间:" + dateTimeStr);
4. String转LocalDateTime
我们也可以使用parse()方法从字符串中解析日期时间对象。
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当前日期时间对象:" + dateTime);

由于Java 8之前的版本使用Date类处理日期时间,因此将Java 8日期时间转化为Date类型很常见,我们可以使用如下方法进行操作。
5. LocalDate转Date
Date dateNew1 = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当前日期对象转date:" + dateNew1);
6. LocalDateTime转Date
Date dateNew2 = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当前日期时间对象转date:" + dateNew2);

7. Date转LocalDate
LocalDate localDate = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println("当前date转日期对象:" + localDate);
8. Date转LocalDateTime
LocalDateTime localDateTime = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("当前date转日期时间对象:" + localDateTime);

9. Date相互转String
可以自己抽离一个方法,根据格式化来转化为自己想要的格式!也可以使用三方的格式转化,比如:hutool
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("date转String字符串:" + df.format(dateNew2));
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("String字符串转date:" + df1.parse(dateTimeStr));

需要注意的是
SimpleDateFormat是线程不安全的类,不适用于多线程环境,所以在实际开发中需要注意线程安全问题。可以考虑使用ThreadLocal来解决线程安全问题。
public class ThreadSafeDateFormat {
private ThreadLocal<DateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public DateFormat get() {
return dateFormatThreadLocal.get();
}
}
ThreadSafeDateFormat dateFormat = new ThreadSafeDateFormat();
System.out.println("date转String字符串安全版:" + dateFormat.get().format(dateNew2));
System.out.println("String字符串转date安全版:" + dateFormat.get().parse(dateTimeStr));

四、总结
需要注意的是,在使用时需要注意时区和时间戳的问题,否则可能会出现一些错误。
总之,熟练掌握这些类型之间的转换方式可以提高我们的开发效率,也可以避免一些常见的错误,在实际开发中能够更加高效地处理日期时间相关的任务。
如果对你有帮助,还请动一下您的发财小手,关注一下公众号哈!!谢谢您的关注!!
建了一个IT交流群,欢迎大家加入,过期加我拉你们进哈!

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项的更多相关文章
- Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等
从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...
- LocalDateTime代替Date
为什么需要LocalDate.LocalTime.LocalDateTime Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 使用SimpleDa ...
- 时间戳和LocalDateTime和Date互转和格式化
一 前言 续上篇java8在日常开发中使用LocalDate和LocalTime[https://blog.csdn.net/youku1327/article/details/102771936]中 ...
- 时间的类型的相互转换(date/String)及时区的比较
String ->Date ->String @Test public void date() throws ParseException{ String sdate = "01 ...
- jdk8中LocalDateTime,LocalDate,LocalTime等日期时间类
package com.zy.time; import org.junit.Test; import java.time.*; import java.time.format.DateTimeForm ...
- Java8 LocalDateTime和Date相互转换
很想要用Java的时间api,但有时候还是需要转换为Date. 二者的相互转换并不是一步到位那么简单,所以,还是需要记录一下转换的api Date to LocalDateTime Date toda ...
- LocalDateTime&LocalDate&LocalTime
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime ti ...
- 转——JAVA中calendar,date,string 的相互转换和详细用法
package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class Ca ...
- How to convert any valid date string to a DateTime.
DateTimeFormatInfo pattern = new DateTimeFormatInfo() { ShortDatePattern = "your date pattern&q ...
- Date String转换
这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new Date("2008-04-14&quo ...
随机推荐
- 固定型思维 VS 成长型思维
回顾进入职场工作以来,对比曾经的学生时代,如果让我讲一个对自己影响最大的改变,那就是思维模式的一个转变. 具体来说,就是从一个典型的固定型思维转变成一个具备有成长型思维的人. 当然,我不敢妄称自己已经 ...
- 【Nginx】Nginx访问静态资源
Nginx访问静态资源 即通过IP:端口/文件名 访问文件实现. 修改Nginx配置 location / { # root html; # index index.html index.htm; a ...
- [TSG开发日志4]算法组件、个人编写的库文件如何封装成DLL,如何更好地对接软件开发?
写在前面 这个内容确实是我有点疏忽了,我以为做算法的同事应该多少对这方面会有点了解的.但是我想了一下我刚毕业的时候,确实对这方面的理解不深,查了很多资料才勉强搞懂什么意思,也是后来随着工程学习的愈加深 ...
- LCD与OLED的相爱相杀
目前市面的显示技术主要分为LCD与OLED. 本文主要记录对LCD与OLED的学习. 导言:介绍一些专业名词和术语. 像素点:是指在由一个数字序列表示的图像中的一个最小单位,称为像素. 一张图片在显示 ...
- 【go语言】1.1.2 Go 语言的特性
1. 简洁的语法 Go 语言的语法设计上非常简洁明了,没有复杂的继承和泛型,也没有异常处理,但这并不影响它的功能性和表达力.这使得 Go 语言容易学习和使用. 例如,以下是一个简单的 Go 函数,用于 ...
- #Powerbi 1分钟学会利用AI,为powerbi报表进行高端颜色设计
在BI报表的设计中,配色方案往往成为一大难题,一组切合主题.搭配合理的颜色设计往往能为我们的报表,加分不少. 今天,就介绍一个AI配色的网站,利用AI为pbi报表进行配色设计. 一:网站网址 http ...
- 使用kube-bench检测Kubernetes集群安全
目录 一.系统环境 二.前言 三.CIS (Center for Internet Security)简介 四.什么是Kube-Bench? 五.使用kube-bench检测不安全的设置 5.1 手动 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-12-playwright操作iframe-中篇
1.简介 按照计划今天就要用实际的例子进行iframe自动化测试.经过宏哥长时间的查找,终于找到了一个含有iframe的网页(QQ邮箱和163邮箱),别的邮箱宏哥就没有细看了.所以今天这一篇的主要内容 ...
- 使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题
文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了. 犹记得从学 node 的第一天,就 ...
- 【matplotlib基础】--子图
使用Matplotlib对分析结果可视化时,比较各类分析结果是常见的场景.在这类场景之下,将多个分析结果绘制在一张图上,可以帮助用户方便地组合和分析多个数据集,提高数据可视化的效率和准确性. 本篇介绍 ...