3. 新增日期时间API
JDK8之前日期时间处理使用SimpleDateFormat、Calendar等类,这些类的 API设计较差,日期/时间对象比较、加减等操作较为繁琐,且java.util.Date 是非线程安全的。
JDK8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理,新增了很多常见api,如日期/时间的比较、加减、格式化等操作。
3.1. 线程优化
JDK8之前,我们使用SimpleDateFormat来进⾏日期的格式化操作,但SimpleDateFormat不是线程安全的,存在并发问题。
在JDK8中,引⼊了DateTimeFormatter类,它是线程安全的。
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
可参见LocalDateTime(日期及时间)。
3.2. 核心类
3.2.1. LocalDate(日期)
LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年月日。 也可以访问其他日期字段,例如日期,星期,该类不存储或表示时间或时区。
这个类是 不可变的 和 线程安全的。
import java.time.LocalDate;
public class LocalDateTest {
public static void main(String[] args) {
//1.获取当前日期
LocalDate today = LocalDate.now();
System.out.println(today);//2019-12-03
System.out.println("现在是哪年:"+today.getYear());//2019
System.out.println("现在是哪月 :"+today.getMonth());//DECEMBER
System.out.println("现在是哪月 (数字):"+today.getMonthValue());//12
System.out.println("现在是几号:"+today.getDayOfMonth());//3
System.out.println("现在是周几:"+today.getDayOfWeek());//TUESDAY
//2.修改
LocalDate newDate = today.withYear(1);//返回此日期的副本,并更改日期。
System.out.println(newDate);//0001-12-03
//3.加
LocalDate newDate2 = today.plusMonths(10);//加上指定数量的月份,返回新日期对象
System.out.println(newDate2);//2020-10-03
//4.减
LocalDate newDate3 = today.minusMonths(1);//减去指定数量的月份,返回新日期对象
System.out.println(newDate3);//2019-11-03
//5.比较
//5.1. compareTo(ChronoLocalDate other) 将当前日期与另一个日期进行比较,返回正值、赋值、零。
int res1 = newDate2.compareTo(newDate3);
System.out.println(res1);//1(newDate2大)
int res2 = newDate3.compareTo(newDate2);
System.out.println(res2);//-1(newDate2大)
int res3 = today.compareTo(today);
System.out.println(res3);//0(today与today相等)
//5.2. isAfter(ChronoLocalDate other) 检查此日期是否在指定日期之后。
boolean res4 = newDate2.isAfter(newDate3);
System.out.println(res4);//true(newDate2大)
//5.3. isEqual(ChronoLocalDate other) 检查此日期是否等于指定的日期。
boolean res5 = newDate2.equals(newDate3);
System.out.println(res5);//false(today与today不相等)
}
}
3.2.2. LocalTime(时间)
这个类是不可变的和线程安全的。
API基本同LocalDate(日期),详情参考对应API。
3.2.3. LocalDateTime(日期及时间)
这个类是不可变的和线程安全的。
API基本同LocalDate(日期),详情参考对应API。
日期时间与字符串的转换(示例):
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeTest {
public static void main(String[] args) {
//获取指定日期时间对象
LocalDateTime myDay = LocalDateTime.of(1993, 04, 9, 20, 0, 0);
System.out.println(myDay);//1993-04-09T20:00
//获取当前日期时间
LocalDateTime today = LocalDateTime.now();
System.out.println(today);//2019-12-03T15:36:49.473
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//1.格式化当前日期时间为字符串
String todayStr = fmt.format(today);
System.out.println(todayStr);//2019-12-03 15:39:01
//2.将字符串解析为日期时间对象
String dateStr = "2019-01-01 00:00:00";
LocalDateTime date = null;
if(dateStr != null && !"".equals(dateStr)) {
date = LocalDateTime.parse(dateStr, fmt);//dateStr必须严格遵守fmt定义的格式
}
System.out.println(date);//2019-12-03T15:42:14
}
}
3.2.4. Duration(间隔)
这个类是不可变的和线程安全的。
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DurationTest {
public static void main(String[] args) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateStr1 = "2019-01-01 00:00:00";
String dateStr2 = "2018-12-26 23:03:10";
LocalDateTime date1 = LocalDateTime.parse(dateStr1, fmt);
LocalDateTime date2 = LocalDateTime.parse(dateStr2, fmt);
Duration dur = Duration.between(date1, date2);//第二个参数减去第一个参数
System.out.println("相差天数:"+dur.toDays());//-5
System.out.println("相差小时数:"+dur.toHours());//-120
System.out.println("相差分钟数:"+dur.toMinutes());//-7256
System.out.println("相差秒数:"+dur.toMillis());//-435410000
System.out.println("相差微秒数:"+dur.toNanos());//-435410000000000
}
}