美文网首页程序员
Java 8 Date-Time API概览

Java 8 Date-Time API概览

作者: liycode | 来源:发表于2016-05-31 13:49 被阅读559次

    根据网上资料整理

    java 8增加了新的Date-Time API (JSR 310),增强对日期与时间的处理。它在很大程度上受到Joda-Time的影响。之前写过一篇关于Joda-Time的文章,还没写完,现在直接写这个java 8的新Date-Time API。

    Date-Time API都在java.time包下。

    一、设计理念

    Date-Time API使用如下几个设计理念开发而成。

    清晰

    API里的方法定义良好,它们的行为是明确可预测的。例如,调用一个Date-Time方法并传递一个null参数必定会触发NullPointerException异常。

    流式

    Date-Time API 提供一个流式接口,使代码更容易被阅读。因为大多数方法不允许null参数,也不会返回null,方法调用可以被连在一起,使代码更快被理解。例如:

    LocalDate today = LocalDate.now();
    LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
    

    不可变

    Date-Time API中的大多数类创建的对象都是不可变的,当它被创建后不能被修改。对不可变对象进行的一些操作会返回一个新对象。这意味这Date-Time API是线程安全的。例如,创建一个date或者time对象使用of, from, 或者 with前缀,而不是一个构造器,并且也没有set方法。

    LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
    LocalDate firstBirthday = dateOfBirth.plusYears(1);
    

    可扩展

    Date-Time API可以是可扩展的。你可以定义你自己的时间调节器和查询,或者构建你自己的calendar 系统。

    二、概览

    java.time包里有许多可以代表时间和日期的类。这是一个非常丰富的API。下面列出几个关键的类:

    • Instant类,提供了一个机器视角的时间线。
    • LocalDate, LocalTimeLocalDateTime类提供了人类视角的日期和时间,不涉及到时区。
    • ZoneId, ZoneRulesZoneOffset类描述了时区,时区偏移量和时区规则。
    • ZonedDateTime类,代表了与时区关联的时间和日期。OffsetDateTimeOffsetTime分别代表了日期和时间和时间。这些类描述了时区偏移。
    • Duration类在秒和毫秒尺度丈量一段时间。
    • Period类在年、月和日尺度上丈量一段时间。

    其他不是ISO日历系统的可以使用java.time.chrono包中的类。这里不介绍啦。

    三、实例

    3.1 获取当前日期和时间

    LocalDate可以表示当前日期。它只包含日期不包含时分秒。

    LocalTime可以表示当前时间。它不包含日期。

    LocalDate date = LocalDate.now();
    System.out.println(date);
    
    LocalTime time = LocalTime.now();
    
    System.out.println(time);
    
    // 输出
    2017-03-07
    23:16:45.433
    

    由此可见它输出的日期是格式化后的。

    3.2 获取当前年月日

    LocalDate now = LocalDate.now();  
    int year = now.getYear();  
    int month = now.getMonthValue();  
    int day = now.getDayOfMonth();
    
    System.out.println(year);
    System.out.println(month);
    System.out.println(day);
    
    // 输出
    2017
    3
    7
    

    不用考虑用java.util.Calendar月份从0开始的问题。

    3.3 获取指定日期**

    LocalDate date = LocalDate.of(2017, 2, 14);
    
    System.out.println(date);
    
    // 输出
    2017-02-14
    

    根据月日判断日期是否相等

    MonthDay不包含年份信息。可以用来代表每年重复出现的日期。

    LocalDate now = LocalDate.now();
    
    System.out.println(MonthDay.from(now));
    
    System.out.println(MonthDay.of(6,1));
    
    System.out.println(MonthDay.from(now).equals(MonthDay.of(6,1)));
    
    // 输出
    --03-07
    --06-01
    false
    

    可以看到年份被-代替了。

    3.4 日期格式化与解析

    // 将字符串解析为日期对象
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate date = LocalDate.parse("2017-06-01",formatter);
    System.out.println(date);
    
    // 将日期重新格式化输出
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd");
    System.out.println(date.format(formatter2));
    
    
    // 输出
    2017-06-01
    2017:06:01
    

    3.5 增加(减少)固定的时间

    LocalDateTime dateTime = LocalDateTime.now();
    System.out.println(dateTime);
    
    // 增加1小时
    dateTime = dateTime.plusHours(1);
    System.out.println(dateTime);
    
    // 增加1天
    dateTime = dateTime.plusDays(1);
    System.out.println(dateTime);
    
    // 输出
    2017-03-08T13:56:00.728
    2017-03-08T14:56:00.728
    2017-03-09T14:56:00.728
    

    都是.plusXXX,如果想减少,传入负数即可。

    3.6 增加(减少)固定的时间第二种方式

    LocalDate date = LocalDate.now();
    System.out.println(date);
    
    LocalDate nextWeek = date.plus(1, ChronoUnit.WEEKS);
    
    System.out.println(nextWeek);
    
    // 输出
    2017-03-08
    2017-03-15
    

    ChronoUnit类有许多常用单位,意思也很容易明白。

    3.7 比较日期前后顺序

    LocalDate today = LocalDate.now();
    
    LocalDate childrensDay = LocalDate.of(2017,6,1);
    
    System.out.println(today.isAfter(childrensDay));
    System.out.println(childrensDay.isAfter(today));
    
    // 输出
    false
    true
    

    3.8 判断是否是闰年

    LocalDate today = LocalDate.now();
    
    System.out.println(today.isLeapYear());
    
    // 输出
    false
    

    3.9 计算两日期间的天数等

    LocalDateTime today = LocalDateTime.now();
    LocalDateTime childrensDay = LocalDateTime.of(2017,6,1,0,0,0);
    Duration duration = Duration.between(today,childrensDay);
    
    System.out.println(duration.toDays());
    System.out.println(duration.toHours());
    
    LocalDate today2 = LocalDate.now();
    LocalDate childrensDay2 = LocalDate.of(2017,6,1);
    Period period = Period.between(today2,childrensDay2);
    
    System.out.println(period.getMonths());
    System.out.println(period.getYears());
    
    // 输出
    84
    2017
    2
    0
    

    3.10 新旧Date转换

    Date d = new Date();
    Instant i = d.toInstant();
    
    // 转换成北京时间
    LocalDate date = i.atOffset(ZoneOffset.ofHours(8)).toLocalDate();
    
    Instant timestamp = Instant.now();
    Date d = Date.from(timestamp);
    

    3.11 获取当前毫秒

    Clock clock = Clock.systemUTC();
    
    System.out.println(clock.millis());
    
    // 输出
    1488984534369
    

    3.12 获取两个日期间相差天数

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate date = LocalDate.parse("2017-12-01",formatter);
    LocalDate today = LocalDate.now();
    
    System.out.println(ChronoUnit.DAYS.between(date,today));
    
    // 输出
    5
    

    以后有什么好的例子再补充

    相关文章

      网友评论

        本文标题:Java 8 Date-Time API概览

        本文链接:https://www.haomeiwen.com/subject/lficdttx.html