一、前言

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

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

二、LocalDateTime、LocalDate、Date三者联系

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

原因Date:

  1. 非线程安全的方法

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

  2. 全局变量的使用

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

因此,如果需要在线程中使用日期时间相关的操作,建议使用线程安全的日期时间类,比如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. Unity 4.6 bate 20 or 4.5.5 +vuforia3.0.9 发布到真机错误 解决

    错误图 +错误码 014-11-20 15:45:49.224 youzheng[6527:1035587] ################### enable 32014-11-20 15:45: ...

  2. 零基础实现Java直播(二):实现流程

    一.前提条件 在实现Java直播前,请确保: 已在项目中集成 ZEGO Express SDK,详情请参考 快速开始 - 集成. 已在 ZEGO 控制台 创建项目,并申请有效的 AppID 和 App ...

  3. java volatile是如何保证可见性的?

    lock前缀指令干的事. volatile 修饰的变量在进行写操作时会多出一条如下的汇编指令: lock addl $0x0,(%esp) volatile就是靠这个lock前缀指令去实现可见性的,当 ...

  4. Sealos 私有化部署完全指南

    Sealos 用了五年的时间从一个 K8s 一键安装工具蜕变成了一个真正的云操作系统,将产品体验提升到了极致,也收获了 10w+ 的社区用户. 一个多月前,Sealos 正式发布了公有云托管版本,社区 ...

  5. Linux下定时清空某个文件

    问题 在一台单点机器部署完成且运行一段时间后,发现页面接口报错,登上机器发现磁盘满了.通过du -lh --max-depth=1 和 du -sh * 找出是哪个文件. 发现是 项目中 stdout ...

  6. go run 和 go build的区别

    go run:编译并运行程序,但不会产生exe文件,运行速度也相应较慢 go build : 会产生exe文件,运行速度快

  7. 论文解读(Moka‑ADA)《Moka‑ADA: adversarial domain adaptation with model‑oriented knowledge adaptation for cross‑domain sentiment analysis》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Moka‑ADA: adversarial domain adaptation  with model‑o ...

  8. 【Unity3D】激光雷达特效

    1 由深度纹理重构世界坐标 ​ 屏幕深度和法线纹理简介中对深度和法线纹理的来源.使用及推导过程进行了讲解,本文将介绍使用深度纹理重构世界坐标的方法,并使用重构后的世界坐标模拟激光雷达特效. ​ 本文完 ...

  9. Linux服务器的性能监控与分析

    通过vmstat分析性能  如上图所示,我们在命令vmstat后面添加了两个参数,1表示间隔一秒获取一次,10表示总共获取10次 我们一列一列数据来看: r:代表目前实际运行的指令队列,很高表示CPU ...

  10. pycurl库使用详解

    要使用pycurl库 要初始化一个curl对象 c = pycurl.Curl() 设置选项 c.setopt