JDK8之前时间日期类的问题
- 设计不合理,在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅仅包含日期,此外用于格式化和解析的类在java.text包下。
- 非线程安全,java.util.Date 是非线程安全的,所有的日期类都是可变的,这是java日期类的最大问题之一。
- 时区处理麻烦,日期类并不提供国际化,没有时区支持。
@Test
public void test1(){
Date date = new Date(1970,01,05);
System.out.println("date = " + date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < 50 ; i++) {
new Thread(()->{
try {
System.out.println(sdf.parse("2023-04-03"));
} catch (ParseException e) {
e.printStackTrace();
}
}).start();
}
}
date = Sat Feb 05 00:00:00 CST 3870
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
Exception in thread "Thread-1" Exception in thread "Thread-5" Exception in thread "Thread-4" Exception in thread "Thread-3" Exception in thread "Thread-2" java.lang.NumberFormatException: empty String
Mon Apr 03 00:00:00 CST 2023
Mon Apr 03 00:00:00 CST 2023
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
Mon Apr 03 00:00:00 CST 2023
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
Mon Apr 03 00:00:00 CST 2023
at java.lang.Double.parseDouble(Double.java:538)
Mon Apr 03 00:00:00 CST 2023
at java.text.DigitList.getDouble(DigitList.java:169)
at java.text.DecimalFormat.parse(DecimalFormat.java:2056)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869)