Java8新特性(四)------日期API
前言
在Java8以前,我们使用时间和日期的时候,一般都是用Date类,Date与其他的辅助运算类,比如Calendar和格式化的DateFormat,这几个类足够完成我们平时的功能要求,但是,这些类最大的一个缺点都是,他们都是线程不安全的.在Java8中,为了解决这个问题,Java8加入了一套全新的日期API,切是线程安全的.本文我们就一起来学习一下这些API.
正文
1. Java7中使用日期格式化
在java中,因为Date和DateFormat等类都是线程不安全的,所以在多线程的情况下,我们可以是用ThredLocal
来加锁,实现代码如下:
-
创建一个线程安全的时间转换器:
public class DateFormatThreadLocal { private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { protected DateFormat initialValue() { return new SimpleDateFormat("yyyyMMdd"); } }; public static Date convert(String source) throws Exception { return df.get().parse(source); } }
-
接下来就可以使用了:
@Test public void testDateFormat() throws InterruptedException, ExecutionException { Callable<Date> tasl = new Callable<Date>() { @Override public Date call() throws Exception { return DateFormatThreadLocal.convert("20181210"); } }; //使用线程池用多线程来访问 ExecutorService pool = Executors.newFixedThreadPool(10); List<Future<Date>> result = new ArrayList<>(); for (int i = 0; i < 10; i++) { result.add(pool.submit(tasl)); } for (Future<Date> future : result) { System.out.println(future.get()); } pool.shutdown(); } }
这是我们以前在多线程的情况下解决方案,现在有了Java8为我们提供的time包中的API,我们就不用那么麻烦的去自己加锁啦!
2. Java8中日期的格式化
在Java8中我们可以使用DateTimeFormatter
来构建格式化器,用LocalDate
、LocalTime
、LocalDateTime
来创建一个时间对象,他们的实例是不可变的对象
,分别表示使用ISO-8601日历系统的日期、时间、日期和时间.使用代码如下:
@Test
public void testJava8DateFormat() throws Exception {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
Callable<LocalDate> tasl = new Callable<LocalDate>() {
@Override
public LocalDate call() throws Exception {
return LocalDate.parse("20181210", dtf);
}
};
//使用线程池用多线程来访问
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<LocalDate>> result = new ArrayList<Future<LocalDate>>();
for (int i = 0; i < 10; i++) {
result.add(pool.submit(tasl));
}
for (Future<LocalDate> future : result) {
System.out.println(future.get());
}
pool.shutdown();
}
除了以上的时间类,我们还可以使用Instant来获取和操作时间戳
@Test
public void test2() {
Instant now = Instant.now();//默认获取UTC时区
System.out.println(now);
//要获取我们自己的时间,我们可以运算一下
OffsetDateTime atOffset = now.atOffset(ZoneOffset.ofHours(8));
System.out.println(atOffset);
//获得时间戳
System.out.println(now.toEpochMilli());
}
还可以使用Duration
来计算两个时间之间的间隔,使用Period
来计算两个日期之间的间隔:
@Test
public void test3() {
Instant now = Instant.now();
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant now2 = Instant.now();
Duration between = Duration.between(now, now2);
System.out.println(between.toMillis());//获取两个时间之间的毫秒差
}
TemporalAdjuster
是时间校准器,可以用来操作日期
DateTimeFormatter
用来格式化 时间
在java8中也加入了对时区的支持,带时区的时间分别为:ZonedDate、ZonedTime、ZonedDateTime,其中每个时区都对应着ID.
这些类的详细使用可以参照API.
总结
关于Java8的时间日期的操作使用,就写到这里.