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 ...
随机推荐
- 基于.Net Core实现的飞书文档一键导出服务(支持多系统)
feishu-doc-export 一个支持Windows.Mac.Linux系统的飞书文档一键导出服务,仅需一行命令即可将飞书知识库的全部文档同步到本地电脑.导出速度嘎嘎快,实测700多个文档导出只 ...
- 浅谈REFS文件系统数据恢复研发经历(1)
作为80后技术员, 我一直很喜欢李玟, 是我们那个时代的偶像, 一直也很喜欢听他的歌, 看到她的噩耗, 还是很那么的无法理解, 一个那么好的人怎么会得抑郁症呢, 心里多少还是无法接受. 不过联想到自己 ...
- 玩转AI二维码:揭秘我的漂亮二维码生成秘诀
这几天我又生成了很多漂亮的二维码图片,有了一些感受和想法,特总结此文,分享给大家.需要图片参数的同学可直接看文章最后,我生成了100多张不同风格的图片. 先看效果,喜欢的可以继续读下去. 背景 在这篇 ...
- GetX 关于报错 Null check operator used on a null value的解决
import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'logic.dart'; class Ge ...
- 使用Githud 实现分发IPA包遇到的坑
最近要用到测试包分发,首先想到了,蒲公英,但是把包扔上去,扫描下载的时候发现,现在需要用户登录才能下载,弃了. 又跑到fir ,发现还得实名才能用,还得上传各种证件照,而且好像每天只有10个下载量,. ...
- 用git bash 生成 hexo 博客文件,报错node: command not found
有git bash,也安装了node.js, 为什么在bash里面会说node: command not found? 电脑有段时间不能上网,下载了360系统急救箱,删了很多文件,包括一些exe文件, ...
- git 访问仓库错误
通过https访问git出现错误, failed: Error in the pull function 尝试将https改为http
- PerfView专题 (第十四篇): 洞察那些 C# 代码中的短命线程
一:背景 1. 讲故事 这篇文章源自于分析一些疑难dump的思考而产生的灵感,在dump分析中经常要寻找的一个答案就是如何找到死亡线程的生前都做了一些什么?参考如下输出: 0:001> !t T ...
- RAT蓝队自动化测试框架
RAT蓝队自动化测试框架 介绍 RAT 是根据 MITRE ATT&CK 战术矩阵测试蓝队检测能力的脚本框架,由 python2.7 编写,共有 50 多种不同 ATT&CK 技术点和 ...
- Bug_ku source (WEB) wp
在源代码中注释中发现了flag,提交发现是假的. 我们打开kali用dirserch扫描一下网站后台目录吧 发现.git ,这题应该是一个git泄露的题,用wget吧文件下载到本地,-r 选项的作用是 ...