LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

这篇具有很好参考价值的文章主要介绍了LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

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

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

二、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); 

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

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);

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

由于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);

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

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);

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

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));

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

需要注意的是

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));

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

四、总结

需要注意的是,在使用时需要注意时区和时间戳的问题,否则可能会出现一些错误。

总之,熟练掌握这些类型之间的转换方式可以提高我们的开发效率,也可以避免一些常见的错误,在实际开发中能够更加高效地处理日期时间相关的任务。

如果对你有帮助,还请动一下您的发财小手,关注一下公众号哈!!谢谢您的关注!!

建了一个IT交流群,欢迎大家加入,过期加我拉你们进哈!

LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项文章来源地址https://www.toymoban.com/news/detail-711436.html

到了这里,关于LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 别再用 Date 作为入参了,LocalDateTime、LocalDate 真香!

    作者:TinyThing 链接:https://www.jianshu.com/p/b52db905f020 项目中使用LocalDateTime系列作为dto中时间的类型,但是spring收到参数后总报错,为了全局配置时间类型转换,尝试了如下3中方法。 注:本文基于Springboot2.0测试,如果无法生效可能是spring版本较低导致的。PS:如果你的Controll

    2024年02月11日
    浏览(42)
  • jdk1.8 LocalTime、LocalDate、LocalDateTime 使用大全

    目录 LocalTime、LocalDate、LocalDateTime 区别 LocalTime、LocalDate、LocalDateTime 使用 now 获取当前 时刻、日期、时间 of 获取指定 时刻、日期、时间 plus || minus 增加或者减少 更改指定的 时间 isAfter || isBefore 比较大小 compareTo 时间比较 LocalTime、LocalDate、LocalDateTime 相互转化 String 与 LocalT

    2023年04月21日
    浏览(64)
  • String类型和Date类型相互转换(java)

    ** ** 1、format方法可以把Date类型转换成特定格式的String类型,如果Date类型和定义的SimpleDateFormat长度不一致会自动在后面补充0 2. parse方法可以把String型的字符串转换成特定格式的date类型,使用parse时字符串长度要和定义的SimpleDateFormat对象长度一致 下面test2的例子,由于位数不

    2024年02月15日
    浏览(65)
  • 直线(二维)的表达方式及其相互转化 c++

    直线表达方式有三种如下: 1) a x + b y + c = 0    ( 1 ) ax+by+c=0 space space(1) a x + b y + c = 0     ( 1 ) 这是代数表达方式,也是通用的表达方式,其中法向量为 s = ( − b , a ) s=(-b, a) s = ( − b , a ) 。 2) y = k x + b y=kx+b y = k x + b 这是点斜方式。它很好理解,但是它不能表达垂直于

    2024年02月12日
    浏览(41)
  • JS时间对象(Date)与字符串(String)相互转换

    运行结果: D:DevEnvironmentNodeJsnode.exe D:MyProjectscoding-studysrcmainresourcesstaticutils.js format1 = 2022年09月23日 23:24:39.836 星期五 第3季度 format2 = 2022年9月23日 11:24:39.836 am 周五 第3季度 format3 = 2022-09-23 23:24:39.836 am 五 Process finished with exit code 0 运行结果: D:DevEnvironmentNodeJsnode.exe

    2024年02月16日
    浏览(49)
  • JAVA中int与string相互转化的几种方法

    1、String.valueOf(int i) 2、Integer.toString(int i) 3、i + “”; //i 为 int类型,int+string型就是先将int型的i转为string然后跟上后面的空string。 三种方法效率排序为: Integer.toString(int i) String.valueOf(int i) i+“” 1、Integer.parseInt(String)方法 parseInt()是Integer包装类里的一个方法,可以将字符串解

    2023年04月23日
    浏览(50)
  • java中日期转换Date、DateTime、TimeStamp、String之间相互转换

    1.1Date-String 2.1Date-TimeStamp 2.2TimeStamp-Date DateTime使用依赖 3.1Date-DateTime 方法1: 方法2: 3.2DateTime-Date 4.String转DateTime

    2024年02月15日
    浏览(58)
  • rgb与hsi空间详解及其相互转化(python+opencv)

    效果图: 原图----------- rgb-hsi ----------- 加入噪声后hsi-rgb 实现代码: rgb图片到hsi图片并加入噪声的相互转化 对于单色(灰度)图像而言,其每个像素的亮度用一个数值表示即可;而彩色图像的每个像素包含了颜色信息,每个像素的光强度和色度须用3个数值描述。彩色图像的

    2024年02月05日
    浏览(42)
  • LocalDate、LocalDateTime计算时间差

    LocalDateTime计算天数和时间差 以下是Jdk1.7存在的问题以及Jdk1.8新特性 Jdk1.7的问题   在Jdk1.8版本发布了新的Date-Time API来加强对时间、日期的处理。这是因为在Jdk1.7中时间、日期的处理上存在如下的一些问题。 非线程安全。Date类是非线程安全的,这是Java时间日期类中最大的

    2023年04月15日
    浏览(41)
  • Java中LocalDate、LocalTime、LocalDateTime时间类介绍

    目录         一、三者的介绍         二、实例化 1、普通实例化  2、实例化并设置日期:  3、利用格式化工具实例化并将日期字符串设置为日期         三、常用方法介绍 1、获取星期几 2、获取月份 3、对年月日时分秒进行加减 4、计算两个日期之间的天数 5、

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包