赞
踩
JDK8之前的日期类计算两个时间的差值比较麻烦,比如说求出两个时间的间隔天数需要做很多操作。在格式化和解析时间方面,SimpleDateFormat类是线程不安全的,在多线程的情况下,可能会出现解析异常的情况。
下面举个例子看下:
- /** * 测试SimpleDateFormat的线程不安全问题 */@Testpublic void testOldFormat(){
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); for (int i = 0; i 20; i++) {
- new Thread(()->{
- try {
- Date date = dateFormat.parse("2020-08-05 23:13:54"); System.out.println(date); } catch (ParseException e) {
- e.printStackTrace(); } }).start(); }}
运行上面的代码后,可能会出现异常和解析时间错误的情况,此次我出现的异常如下:
Exception in thread "Thread-3" Exception in thread "Thread-2" java.lang.NumberFormatException: For input string: ".220222022202E" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:578) at java.lang.Long.parseLong(Long.java:631) at java.text.DigitList.getLong(DigitList.java:195) at java.text.DecimalFormat.parse(DecimalFormat.java:2051) at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869) at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) at java.text.DateFormat.parse(DateFormat.java:364)Wed Aug 05 23:13:54 CST 2020 at com.gsgb.local.LocalTest.lambda$testOldFormat$0(LocalTest.java:43) at java.lang.Thread.run(Thread.java:748)
这也说明了SimpleDateFormat类是线程不安全的。
总的来说,JDK8之前的日期类的问题有:
本节主要说说LocalDateTime、LocalDate、LocalTime,由于它们的用法基本上相同,主要针对LocalDateTime讲解。
JDK8之前的日期类有线程安全的问题,JDK8的新日期类大部分都是final修饰的,是不可变的,而且其构造函数都是私有的,我们需要调用静态方法生成日期类的对象。
- /** * now方法获取当前时间 */@Testpublic void testNow() {
- LocalDateTime localDateTime = LocalDateTime.now(); LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); System.out.println("localDateTime的时间是: " + localDateTime); System.out.println("localDate的时间是: " + localDate); System.out.println("localTime的时间是: " + localTime);}
控制台:
localDateTime的时间是:2020-08-05T23:41:00.902localDate的时间是:2020-08-05localTime的时间是:23:41:00.903
在上面三个日期类中有一些静态常量,我觉得LocalTime的还有点用,其他的用处好像不是很大,感兴趣可以去翻下源码看看:
- /** * 获取一些常量 * 测试时间日期类的一些常量 * 主要看{
- @link LocalTime}的一些 */@Testpublic void testConstant() {
- System.out.println("某一天的结束时间是: " + LocalTime.MAX); System.out.println("某一天的开始时间是: " + LocalTime.MIN); System.out.println("某一天的半夜时间是: " &
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。