14. 时间日期类的不足

20 阅读1分钟

JDK8之前时间日期类的问题

  1. 设计不合理,在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间,而java.sql.Date仅仅包含日期,此外用于格式化和解析的类在java.text包下。
  2. 非线程安全,java.util.Date 是非线程安全的,所有的日期类都是可变的,这是java日期类的最大问题之一。
  3. 时区处理麻烦,日期类并不提供国际化,没有时区支持。
@Test
public void test1(){
    // 1。设计不合理
    Date date = new Date(1970,01,05);
    System.out.println("date = " + date);


    // 2. 有线程安全问题
    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)