原因
1.Date:非线程安全的方法
Date类的大部分方法都不是线程安全的,比如setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds()等方法。这些方法都可以修改Date对象的内部状态。如果多个线程同时访问和修改同一个Date对象,就会发生竞态条件,导致程序出现错误的结果。String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); System.out.println("当前字符串日期:" + dateStr);2. String转LocalDate
LocalDate date = LocalDate.parse(dateStr); System.out.println("日期对象:" + date);
String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println("当前字符串日期时间:" + dateTimeStr);4. String转LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); System.out.println("当前日期时间对象:" + dateTime);
Date dateNew1 = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); System.out.println("当前日期对象转date:" + dateNew1);6. LocalDateTime转Date
LocalDate localDate = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); System.out.println("当前date转日期对象:" + localDate);8. Date转LocalDateTime
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));
// 堆代码 duidaima.com 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));