新日期API
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:
非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
/*一些吐槽:
1.java.util.Date被设计为日期 + 时间的结合体。也就是说如果只需要日期,或者只需要单纯的时间,用Date是做不到的。
2. 年要减1900… 月从0-11 …
3. Date是可变的,也就是说我把一个Date日期时间对象传给方法,方法内竟然还能更改
*/
@Test
public void test() {
Date currDate = new Date();
System.out.println("当前日期是①:" + currDate);
boolean holiday = isHoliday(currDate);
System.out.println("是否是假期:" + holiday);
System.out.println("当前日期是②:" + currDate);
}
/**
* 是否是假期
*/
private static boolean isHoliday(Date date) {
// 假设等于这一天才是假期,否则不是
Date holiday = new Date(2021 - 1900, 10 - 1, 1);
if (date.getTime() == holiday.getTime()) {
return true;
} else {
// 模拟写代码时不注意,使坏
date.setTime(holiday.getTime());
return true;
}
}
新的日期API
-
日期LocalDate
-
时间LocalTime
-
日期时间LocalDateTime
日期
LocalDate
@Test
public void test02() {
// ========== 获得日期 ==========
// 获得当前日期
LocalDate now = LocalDate.now();
System.out.println(now);
// 获得指定日期的时间
LocalDate date = LocalDate.of(2020, 1, 1);
System.out.println(date);
// 获得年
System.out.println(now.getYear());
// 获得月
System.out.println(now.getMonthValue());
// 获得日
System.out.println(now.getDayOfMonth());
// ========== 设置日期 ==========
// 设置之后返回的日期是一个新的日期对象,之前的日期并未更改
// 设置年
LocalDate withYear = now.withYear(1990);
// 设置月
LocalDate withMonth = now.withMonth(8);
// 设置日
LocalDate withDayOfMonth = now.withDayOfMonth(8);
System.out.println(now);
System.out.println(withYear);
// 增加日期,返回新的日期对象
// 增加的方法plusXxx()
LocalDate plusYears = now.plusYears(2);
// 减少日期
// 减少的方法 minusXxx()
LocalDate minusYears = now.minusYears(2);
}
时间
LocalTime
@Test
public void test03() {
// ========== 获得时间 ==========
// 获得当前时间
LocalTime now = LocalTime.now();
System.out.println(now);
// 获得指定时间
LocalTime of1 = LocalTime.of(10, 10); // 时分
LocalTime of2 = LocalTime.of(10, 10,10);// 时分秒
LocalTime of3 = LocalTime.of(10, 10,10,10);// 时分秒纳秒
System.out.println(of1);
// 获得时,分,秒
System.out.println(now.getHour());
System.out.println(now.getMinute());
System.out.println(now.getSecond());
// ========== 设置时间 ==========
// 设置时
LocalTime hour = now.withHour(8);
// 设置分
LocalTime minute = now.withMinute(8);
// 设置秒
LocalTime second = now.withSecond(8);
System.out.println(now);
System.out.println(hour);
// 增加时间,返回新的时间对象
// 增加的方法plusXxx()
LocalTime plus = now.plusHours(2);
// 减少时间
// 减少的方法 minusXxx()
LocalTime minus = now.minusHours(2);
}
日期时间
LocalDateTime
@Test
public void test04() {
// ========== 获得日期时间 ==========
// 获得当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
// 获得指定时间
LocalDateTime of1 = LocalDateTime.of(1900, 1, 1, 10, 10); //年月日时分
LocalDateTime of2 = LocalDateTime.of(2000, 10,10,8,8,8);// 年月日时分秒
System.out.println(of1);
// 获得年,月,日
System.out.println(now.getYear());
System.out.println(now.getMonthValue());
System.out.println(now.getDayOfMonth());
// 获得时,分,秒
System.out.println(now.getHour());
System.out.println(now.getMinute());
System.out.println(now.getSecond());
// ========== 设置日期时间 ==========
// 设置时
LocalDateTime hour = now.withHour(8);
// 设置分
LocalDateTime minute = now.withMinute(8);
// 设置秒
LocalDateTime second = now.withSecond(8);
System.out.println(now);
System.out.println(hour);
// 增加时间,返回新的时间对象
// 增加的方法plusXxx()
LocalDateTime plus = now.plusHours(2);
// 减少时间
// 减少的方法 minusXxx()
LocalDateTime minus = now.minusHours(2);
// 判断日期
System.out.println(now.isAfter(plus));
System.out.println(now.isBefore(plus));
System.out.println(now.isEqual(plus));
}