首页 > 其他分享 >LocalDateTime、LocalDate、Date、String相互转化大全及其注意事项

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

时间:2023-10-24 10:14:14浏览次数:38  
标签:String 日期 线程 LocalDateTime Date LocalDate

一、前言

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

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

二、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交流群,欢迎大家加入,过期加我拉你们进哈!

26cb9db369f097cc166cb8c1397e594.jpg

标签:String,日期,线程,LocalDateTime,Date,LocalDate
From: https://www.cnblogs.com/wang1221/p/17784077.html

相关文章

  • C++常用语法知识-- std::istringstream
    C++常用语法知识--std::istringstream介绍std::istringstream是C++标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。通常从字符串中解析数据,例如整数、浮点数等。使用方法创建std::istringstream对象,首先,需要创建一个std::istringstream对象,将......
  • EasyExcel读取所有sheet(doReadAll)报BatchUpdateException: Duplicate entry
    报错截图  原因:监听器保存数据时,但是没有重置缓存数据,导致读取第二个sheet的时候,缓存里存的数据还包含上一个或多个sheet的数据。每个sheet读取完毕后调用一次doAfterAllAnalysed。在doAfterAllAnalysed方法调用批量插入后,需要清除缓存数据cacheDataList=ListUtils.newA......
  • tp5 update方法更新数据
    thinkphp5的update方法:返回影响数据的条数,没修改任何数据返回0当要更新的数据和已存在数据库的数据一样时,返回的结果为0修改失败返回false所以在判断更新是否成功,要用===的条件进行判断0和false的情况publicfunctionupdate(){ $result=Db::table('User')->w......
  • 宝塔:续签SSL证书报错string indices must be integers
    网站SSL证书过期,续签的时候,报错stringindicesmustbeintegers。  处理方法:1.点击左侧首页,选择“修复”; 2.修复之后,重新点击网站,设置>>>SSL>>>续签证书,等待流程通过,点击保存即可。 ......
  • StringUtil工具类
    importorg.apache.commons.lang3.StringUtils;importjava.io.UnsupportedEncodingException;importjava.net.URLEncoder;importjava.util.*;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***字符串操作类,包括分割,转换,大写首字母**/publicclassStr......
  • [924] f-strings in Python
    ref:f-stringsinPythonref:Python'sF-StringforStringInterpolationandFormattingF-strings,alsoknownasformattedstringliterals,areafeatureintroducedinPython3.6thatprovideaconciseandconvenientwaytoembedexpressionsinside......
  • 一键解决[notice] A new release of pip available: 22.2 -> 22.2.2 [notice] To updat
    [notice]Anewreleaseofpipavailable:22.2->22.2.2[notice]Toupdate,run:python.exe-mpipinstall--upgradepip文章目录问题描述解决思路解决方法问题描述[notice]Anewreleaseofpipavailable:22.2->22.2.2[notice]Toupdate,run:python.exe-mpip......
  • How to use regular expression to match a special meta tag in html string using j
    HowtouseregularexpressiontomatchaspecialmetataginhtmlstringusingjavascriptAllInOnemetatagerror❌consthtml=`<!DOCTYPEhtml><htmllang="en"><head><metaname="twitter:card"content......
  • Nessus 10.6 Auto Installer for macOS Sonoma (updated Oct 2023)
    Nessus10.6AutoInstallerformacOSSonoma(updatedOct2023)发布Nessus试用版自动化安装程序,支持macOSSonoma、RHEL9和Ubuntu22.04请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-macos/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • std::istringstream的用法
    1.概要std::istringstream是C++标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。它通常用于从字符串中解析数据,例如整数、浮点数等。以下是关于std::istringstream的详细用法:创建std::istringstream对象:首先,你需要创建一个std::istringstrea......