之前的笔记中说java8前的时间类型是线程不安全的,针对这个不安全偶在上一篇说时间类型的博客中插播了一下线程池ExecutorService,接下来正式地记一下java8中的新时间类型:
java8为我们做了很多所以针对上一篇中的Date,我们这样写也是没有问题的:提供一个类型及其格式,放到pool中直接call就可以了
public void testJava8DateTime() throws ExecutionException, InterruptedException {
DateTimeFormatter dateTimeFormatter ;//= DateTimeFormatter.ISO_LOCAL_DATE 使用默认提供的格式
dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");//可以自定义格式
Callable<LocalDate> localDateCallable = new Callable<LocalDate>() {
@Override
public LocalDate call() throws Exception {
return LocalDate.parse("20180909",dateTimeFormatter);//不管什么样的改变,产生全新的实例,安全了
}
};
List<Future<LocalDate>> futureList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
futureList.add(executorService.submit(localDateCallable));
}
for (Future<LocalDate> localDateFuture : futureList) {
System.out.println(localDateFuture.get());
}
executorService.shutdown();
}
笔记,知识点的整理
//日期 LocalDate:year-month-day LocalTime:hour-minute-second LocalDateTime:year-month-day-hour-minute-second
LocalDateTime localDateTime = LocalDateTime.now();// 本地时间
LocalDateTime localDateTime1 = LocalDateTime.of(2016, 03, 03, 02, 00, 33);//指定时间
LocalDateTime localDateTime2 = localDateTime.plusYears(2);//加2年
LocalDateTime localDateTime3 = localDateTime.minusMonths(2);//减2个月
System.out.println(localDateTime.getYear() + localDateTime.getMonthValue() + localDateTime.getHour());
//Instant 时间戳(Unix元年:1970.01.01 00:00:00 到某个时间 间的毫秒值
Instant instant = Instant.now();//默认获取格林尼治时间。8个时区
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//我和格林 偏右8个时区
instant.toEpochMilli();//转毫秒
Instant instant1 = Instant.ofEpochSecond(1000);//从元年+1000秒
//region 间隔 Duration:两个“时间”的间隔 Period:两个“日期”的间隔
Instant instant2 = Instant.now();
LocalTime localTime = LocalTime.now();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant instant3 = Instant.now();
LocalTime localTime1 = LocalTime.now();
Duration.between(instant, instant3).toMillis();//转成毫秒
Duration.between(localTime, localTime1).toMillis();
//日期 ——++++++++++++++++++++++++++++++++++++++-----
LocalDate localDate = LocalDate.of(2016, 01, 04);
LocalDate localDate1 = LocalDate.now();
Period.between(localDate, localDate1).getYears();
//endregion
//region DateTimeFormatter 格式化时间、日期
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ISO_DATE;//使用默认提供的格式
LocalDateTime localDateTime5 = LocalDateTime.now();//现在时间
String strDate = localDateTime5.format(dateTimeFormatter1);//转格式(时间.format(格式)
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss");//指定格式
strDate = dateTimeFormatter2.format(localDateTime5);//格式.format(时间)
LocalDateTime newDate = localDateTime5.parse(strDate, dateTimeFormatter2);//时间.parse(要转的时间字符串,格式)
//endregion
//region zonedDate zonedTime zonedDateTime
Set<String> set = ZoneId.getAvailableZoneIds();//获取时间信息
LocalDateTime localDateTime4 = LocalDateTime.now(ZoneId.of("Europe/Tallinn"));//指定时区,获取这个时区的当前时间
ZonedDateTime zonedDateTime = LocalDateTime.now().atZone(ZoneId.of("\"Europe/Tallinn\""));//带时区的时间日期格式
//Tallinn时区的时间日期+与Asian/ShangHai相差的时区数+[Asian/ShangHai]
ZonedDateTime zonedDateTime1 = LocalDateTime.now(ZoneId.of("Europe/Tallinn")).atZone(ZoneId.of("\"Asian/ShangHai\""));
//endregion