1 错误出现
在代码中有需要日期的处理,在方法A中使用了SimpleDateFormat,后期有新的需求,实现新需求的方法B调用了方法A,测试时SimpleDateFormat.parse()出现各种不同的问题,比如multiple points、For input string: “”、empty String等等;
2 问题分析
网上查了一些博客和资料,都是说SimpleDateFormat的并发问题,猜想应该是这个原因;
再跟一下SimpleDateFormat的代码,发现SimpleDateFormat的format()方法和parse()方法都使用日历calendar来操作时间,而calendar是一个共享变量;
SimpleDateFormat继承DateFormat,calendar是DateFormat的共享变量:
SimpleDateFormat的format方法如下,多个线程时在calendar.setTime这里会发生不同线程的修改:
SimpleDateFormat中对DateFormat的抽象方法 parse(String source, ParsePosition pos)的实现:
establish方法重置日期对象cal的属性值,并返回设置好的对象cal值:
3 问题处理
java8提供了LocalDate、LocalTime等日期处理API,LocalDate.parse()方法中使用的DateTimeFormatter不存在线程安全问题;
LocalDate.parse("2023-08-08", DateTimeFormatter.ISO_LOCAL_DATE);
LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));