首页 > 其他分享 >LocalDateTime、LocalDate、Date、String相互转化

LocalDateTime、LocalDate、Date、String相互转化

时间:2023-12-27 16:24:36浏览次数:27  
标签:String date 线程 LocalDateTime Date LocalDate

为什么日期有Date了,还在JDK8中推出了LocalDateTime、LocalDate呢?

  1. 非线程安全的方法

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

  2. 全局变量的使用

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

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

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

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

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

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

综上所述,Java 8中的新日期时间API通过不可变性线程封闭性等技术,有效地解决了线程安全问题。这使得开发者们可以更加安全和便利地在多线程环境下使用日期时间类。

1. LocalDate转String

String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

2. String转LocalDate

LocalDate date = LocalDate.parse(dateStr);System.out.println("日期对象:" + date);

3. LocalDateTime转String

String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

4. String转LocalDateTime

LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

5. LocalDate转Date

Date date = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

6. LocalDateTime转Date

Date date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());

7. Date转LocalDate

LocalDate localDate = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

8. Date转LocalDateTime

LocalDateTime localDateTime = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

9. Date相互转String

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("date转String字符串:" + df.format(new Date()));
        DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("String字符串转date:" + df1.parse(dateTimeStr));

需要注意的是

SimpleDateFormat是线程不安全的类,不适用于多线程环境,所以在实际开发中需要注意线程安全问题。可以考虑使用ThreadLocal来解决线程安全问题。

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ThreadSafeDateFormat {
    private ThreadLocal<DateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    public DateFormat get() {
        return dateFormatThreadLocal.get();
    }

    public static void main(String[] args) throws ParseException {
        ThreadSafeDateFormat dateFormat = new ThreadSafeDateFormat();
        String dateTimeStr = dateFormat.get().format(new Date());
        System.out.println("date转String字符串安全版:" + dateTimeStr);
        System.out.println("String字符串转date安全版:" + dateFormat.get().parse(dateTimeStr));
    }
}

 

标签:String,date,线程,LocalDateTime,Date,LocalDate
From: https://www.cnblogs.com/jhdhl/p/17930788.html

相关文章

  • Qlik 踩坑:Datetime格式转Date格式
    1.背景Qlik中Datetime格式的数据转成Date格式数据有两种方式:Date()函数Qlik自动日历函数[field.autoCalendar.Date]经过实践对比发现,使用第一种方法,即Date()函数只改变数据的显示格式,并未改变数据本身。在对数据进行比较或者聚合时参考的还是源数据。2.实验原始数据......
  • STL-常用容器-string
    3STL-常用容器3.1string容器3.1.1string基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char*区别:char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char型的容器。cplusplus.com/reference/string/string/也可打开上面这个网站查......
  • StringBuilder,一种可变的string
    StringBuilder是Java中用于操作字符串的可变对象。它允许在字符串中进行修改、添加、删除字符等操作,而不会像普通的字符串操作(例如使用String类)那样产生新的字符串对象。这种可变性使得在处理大量字符串拼接或修改时更加高效。与String不同,StringBuilder是可变的,这意味......
  • dremio hive jdbc arp date 类型问题记录
    简单记录下碰到的一些问题分析arthasstack查看调用stackcom.mysql.cj.jdbc.result.ResultSetImplgetDate效果ffect(classcount:2,methodcount:4)costin329ms,listenerId:11ts=2023-12-2606:18:17;thread_name=e3-1a758f......
  • C# 返回字符串 string 中某一个字符第几次出现的位置所在的索引位置
    //返回str从前往后,第count次出现ch字符处的索引位置,失败返回-1;protectedstaticintIndexOf(stringstr,charch,intcount){if(count<1){return-1;}intindex=-1;for(inti=0;i<count;++i){......
  • 无涯教程-PostgreSQL - String函数
    PostgreSQL字符串函数主要用于字符串操作。下表详细介绍了重要的字符串函数-S.No.Name&描述1ASCII()返回最左边字符的数值2BIT_LENGTH()返回参数的长度(以位为单位)3CHAR_LENGTH()返回参数中的字符数4CHARACTER_LENGTH()CHAR_LENGTH()的同义词5CONCAT_WS......
  • 23-String类
    String类的特点1. Java程序中,所有双引号字符串,都是String这个类的对象2.字符串一旦被创建,就不可更改(如果想更改,只能使用新的对象做替换)3. 字符串常量池,让我们使用双引号创建字符串对象时,会先去常量池中查找有没有相同内容的字符串对象,如果有,则直接使用该对象,如果没有,则在常......
  • clearValidate()和resetFields()表单校验的用法和区别
    目标:实现表单重置和清除验证1.整个表单的校验移除<Formref="form"rule={this.rules}><FormItemprop="name"label="姓名"><Input/></FormItem><FormItemprop="age"label="年龄"><Input/></For......
  • Windows Server 2016 中文版、英文版下载 (updated Dec 2023)
    WindowsServer2016中文版、英文版下载(updatedDec2023)WindowsServer2016Version1607,2023年12月更新请访问原文链接:https://sysin.org/blog/windows-server-2016/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org本站将不定期发布官方原版风格月度更新I......
  • Windows Server 2016 OVF, updated Dec 2023 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedDec2023(sysin)-VMware虚拟机模板2023年12月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现在......