JDK8新特性【新日期API】

新日期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));
    }

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值