前言:LocalDateTime、LocalDate、Date三者联系
非线程安全的方法
Date类的大部分方法都不是线程安全的,比如
setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds()
等方法。这些方法都可以修改Date对象的内部状态。如果多个线程
同时访问和修改同一个Date
对象,就会发生竞态条件,导致程序出现错误的结果。全局变量的使用
Date类有两个静态变量,分别是
DateParser
和CalendarSystem
。这两个变量是全局共享
的,如果多个线程同时访问和修改这两个变量,也会导致程序出现竞态条件。因此,如果需要在线程中使用日期时间相关的操作,建议使用线程安全的日期时间类,比如JDK8中引入的新日期时间API中的
LocalDateTime、LocalDate
等类,或者使用线程安全的DateFormat和Calendar
类。
1. LocalDate互转String >> Date >> LocalDate
public class BaseTest {public static void main(String[] args) {String str = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));System.out.println("日期字符串 >>> " + str );LocalDate localDate = LocalDate.parse(str);System.out.println("日期对象 >>> " + localDate );Date date = Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());System.out.println("日期对象转date >>> " + date);LocalDate localDate2 = date .toInstant().atZone(ZoneId.systemDefault()).toLocalDate();System.out.println("date转日期对象 >>> " + localDate2);}}
2. LocalDateTime互转String >> Date >> LocalDateTime
public class BaseTest {public static void main(String[] args) {String str = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println("日期字符串 >>> " + str);LocalDateTime localDateTime = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println("日期对象 >>> " + localDateTime);Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());System.out.println("日期时间对象转date >>> " + date );LocalDateTime localDateTime2 = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();System.out.println("date转日期时间对象 >>> " + localDateTime2);}}
3.Date相互转String
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("date转String字符串:" + df.format(date));DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("String字符串转date:" + df1.parse(str));
注意:SimpleDateFormat
是线程不安全的类,不适用于多线程环境,所以在实际开发中需要注意线程安全问题。可以考虑使用ThreadLocal
来解决线程安全问题。
public class BaseTest {public static void main(String[] args) throws ParseException {String str = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));LocalDateTime localDateTime = LocalDateTime.parse(str, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());ThreadSafeDateFormat dateFormat = new ThreadSafeDateFormat();System.out.println("date转String字符串安全版:" + dateFormat.get().format(date));System.out.println("String字符串转date安全版:" + dateFormat.get().parse(str));}}class ThreadSafeDateFormat {public ThreadLocal<DateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() ->new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));public DateFormat get() {return dateFormatThreadLocal.get();}}