一、前言

大家在开发过程中必不可少的和日期打交道,对接别的系统时,时间日期格式不一致,每次都要转化!

每次写完就忘记了,小编专门来整理一篇来详细说一下他们四个的转换的方法,方便后面使用!!

二、LocalDateTime、LocalDate、Date三者联系

这里先说一下,为什么日期有Date了,还在JDK8中推出了LocalDateTime、LocalDate呢?

原因Date:

  1. 非线程安全的方法

    Date类的大部分方法都不是线程安全的,比如setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds()等方法。这些方法都可以修改Date对象的内部状态。如果多个线程同时访问和修改同一个Date对象,就会发生竞态条件,导致程序出现错误的结果。

  2. 全局变量的使用

    Date类有两个静态变量,分别是DateParser和CalendarSystem。这两个变量是全局共享的,如果多个线程同时访问和修改这两个变量,也会导致程序出现竞态条件。

因此,如果需要在线程中使用日期时间相关的操作,建议使用线程安全的日期时间类,比如JDK8中引入的新日期时间API中的LocalDateTime、LocalDate等类,或者使用线程安全的DateFormat和Calendar类。

我们在说一下LocalDateTime他们是怎么实现线程安全的:

LocalDateTime它是由LocalDate和LocalTime两个不可变的类组成的。LocalDate和LocalTime各自都是线程安全的,它们的时间信息都是基于UTC(协调世界时)计算的,并且不依赖于系统的时区设置。LocalDateTime也是一样,它是由系统时区和UTC计算得到的。

有兴趣的可以看一下:协调世界时介绍

这些类主要是使用了以下两个技术来解决线程安全问题:

  1. 不可变性:这些类都是不可变的,一旦创建后,就不能再被修改。因此,就不存在并发修改的问题了。

  2. 线程封闭性:这些类的构造方法都是线程安全的,并且不允许外部修改其中的状态。因此,就不需要通过锁或其他机制来保护它们的状态。

综上所述,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相互转化大全及其注意事项的更多相关文章

  1. Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等

    从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...

  2. LocalDateTime代替Date

    为什么需要LocalDate.LocalTime.LocalDateTime Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 使用SimpleDa ...

  3. 时间戳和LocalDateTime和Date互转和格式化

    一 前言 续上篇java8在日常开发中使用LocalDate和LocalTime[https://blog.csdn.net/youku1327/article/details/102771936]中 ...

  4. 时间的类型的相互转换(date/String)及时区的比较

    String ->Date ->String @Test public void date() throws ParseException{ String sdate = "01 ...

  5. jdk8中LocalDateTime,LocalDate,LocalTime等日期时间类

    package com.zy.time; import org.junit.Test; import java.time.*; import java.time.format.DateTimeForm ...

  6. Java8 LocalDateTime和Date相互转换

    很想要用Java的时间api,但有时候还是需要转换为Date. 二者的相互转换并不是一步到位那么简单,所以,还是需要记录一下转换的api Date to LocalDateTime Date toda ...

  7. LocalDateTime&LocalDate&LocalTime

    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime ti ...

  8. 转——JAVA中calendar,date,string 的相互转换和详细用法

    package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class Ca ...

  9. How to convert any valid date string to a DateTime.

    DateTimeFormatInfo pattern = new DateTimeFormatInfo() { ShortDatePattern = "your date pattern&q ...

  10. Date String转换

    这种转换要用到java.text.SimpleDateFormat类 字符串转换成日期类型: 方法1: 也是最简单的方法 Date date=new Date("2008-04-14&quo ...

随机推荐

  1. Task Execution and Scheduling In SpringBoot

    开天辟地 Task Execution and Scheduling In the absence of an Executor bean in the context, Spring Boot au ...

  2. 【SpringCloud】Ribbon

    Ribbon 负载均衡原理 order-service 发起 user-service 请求,被ribbon进行拦截; ribbon会向注册中心拉取user-service 相对应的服务; 注册中心返 ...

  3. SSE图像算法优化系列三十一:RGB2HSL/RGB2HSV及HSL2RGB/HSV2RGB的指令集优化-上。

    RGB和HSL/HSV颜色空间的相互转换在我们的图像处理中是有着非常广泛的应用的,无论是是图像调节,还是做一些肤色算法,HSL/HSV颜色空间都非常有用,他提供了RGB颜色空间不具有的一些独特的特性, ...

  4. 备份Ubunut已安装的软件包并在新的Ubuntu 系统上恢复

    0.查看已安装列表 dpkg -L xxxx.deb 1.备份 安装apt-clone: $sudo apt-get install apt-clone 提供一个保存备份文件的位置.我们在 /back ...

  5. linux内核Makefile中的变量build--- 过渡篇(五)

    一. kbuild系统主要涉及的几个文件 文件名 作用 Makefile 内核源代码顶层目录的Makefile文件 scripts/Makefile.build 通常在进行递归make时会用到的Mak ...

  6. 使用Docker+PHP搭建苹果Maccms的影视站详细教程

    自己做博客站太难了,SEO太差自己都搜不到,原文地址求你点进去看:https://typecho.hanzhe.site/archives/88 说在前面 很早之前还没参加工作的时候,手头没钱,想要看 ...

  7. 初识C语言中的typedef、define以及Status

    小阿杰最近开始看数据结构啦嘿嘿嘿, 可惜小阿杰C语言功底稀薄,以此篇随笔记录一下我卑微的学习之路/苦涩/苦涩 首先define没啥好说的,在文件开头,定义一个固定不变的值. #define MAXN ...

  8. KVM VM 添加 usb 设备

    制作xml文件 参考链接:https://libvirt.org/formatdomain.html#usb-pci-scsi-devices <hostdev mode='subsystem' ...

  9. Linux 修改文本dos/unix 格式

    使用 vi 命令打开文件,使用 :set ff 查看格式 如果显示dos,可使用 :set ff=unix 修改 pem 证书,使用 cat xx.key xx.crt DigiCertCA.crt ...

  10. 使用TypeScript类型注解,编写更干净的JS代码

    TypeScript 可以看作是 JavaScript 的超集,不仅包含了 JavaScript 的所有内容,还拓展了语法.规定了类型约束,使得我们可以编写更干净.完整的代码. 类型注解 TypeSc ...