1、Java8之前日期的痛点
1、构造年的日期需传入year-1900
2、每周的日期从周一开始,不符合各国用户习惯
3、 TimeZone提供时区支持但不好用,且线程不安全
4、日期格式化规划混乱,不应该在java.text包中
2、Java8中的改变
1、日期规划到了同一个包中:java.time.*
2、日期表示很灵活,可读性高
3、解决了线程安全问题
3、线程安全问题体现在哪里?
参见TestSimpleDateFormat
传统方式如何解决?
通过ThreadLocal
4、源码
TestSimpleDateFormat
package com.atguigu.java8;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestSimpleDateFormat {
public static void main(String[] args) throws Exception {
/*SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Callable task = new Callable() {
@Override
public Date call() throws Exception {
return sdf.parse("20161121");
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();*/
//解决多线程安全问题
/*Callable task = new Callable() {
@Override
public Date call() throws Exception {
return DateFormatThreadLocal.convert("20161121");
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();*/
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
Callable task = new Callable() {
@Override
public LocalDate call() throws Exception {
LocalDate ld = LocalDate.parse("20161121", dtf);
return ld;
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List> results = new ArrayList<>();
for (int i = 0; i < 10; i++) {
results.add(pool.submit(task));
}
for (Future future : results) {
System.out.println(future.get());
}
pool.shutdown();
}
}
DateFormatThreadLocal
package com.atguigu.java8;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateFormatThreadLocal {
private static final ThreadLocal df = new ThreadLocal(){
protected DateFormat initialValue(){
return new SimpleDateFormat("yyyyMMdd");
}
};
public static final Date convert(String source) throws ParseException{
return df.get().parse(source);
}
}