JAVA8新的日期库及使用示例

java.time下的关键类

java.time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类


java8是如何处理时间及日期的

  1. 如何获取当天的日期
    1
    2
    3
    LocalDate today = LocalDate.now();  
    System.out.println("今天的日期是:" + today);
    // 今天的日期是:2018-09-26
  2. 如何获取当前的年月日
    1
    2
    3
    4
    5
    6
    LocalDate today = LocalDate.now();
    int year = today.getYear();
    int month = today.getMonthValue();
    int day = today.getDayOfMonth();
    System.out.println(year + "年:" + month + "月:" + day + "日:");
    // 2018年9月26日
  3. 如何获取某个特定的日期
    1
    2
    3
    LocalDate dateOfBirth = LocalDate.of(2018,10,1);
    System.out.println("您输入的日期是:" + dateOfBirth);
    // 您输入的日期是:2018-10-01
  4. 检查两个日期是否相等
    1
    2
    3
    4
    LocalDate date = LocalDate.of(2018,9,26);
    LocalDate day = LocalDate.now();
    System.out.println("今天是2018-09-26吗?" + day.equals(date));
    // 今天是2018-09-26吗?true
  5. 检查重复事件,比如生日
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LocalDate dateOfBirth = LocalDate.of(1996,6,6);
    LocalDate day = LocalDate.now();
    MonthDay birthday = MonthDay.of(dateOfBirth.getMonthValue(), dateOfBirth.getDayOfMonth());
    MonthDay currMonthDay = MonthDay.from(date);
    if (currMonthDay.equals(birthday)) {
    System.out.println("今天是您生日。");
    } else {
    System.out.println("对不起,今天不是您生日。");
    }
    // 对不起,今天不是您生日。
  6. 如何增加时间里面的小时数
    1
    2
    3
    4
    5
    6
    LocalTime localTime = LocalTime.now();
    System.out.println("现在时间是:" + localTime);
    LocalTime add = localTime.plusHours(2);
    System.out.println("增加俩小时后的时间是:" + add);
    // 现在时间是:22:50:43.730
    // 增加俩小时后的时间是:00:50:43.730
  7. 如何获取1周后的日期
    1
    2
    3
    4
    5
    6
    LocalDate today = LocalDate.now();  
    System.out.println("今天的日期是:" + today);
    LocalDate oneWeek = today.plus(1, ChronoUnit.WEEKS);
    System.out.println("一周后的日期是:" + oneWeek);
    // 今天的日期是:2018-09-26
    // 一周后的日期是:2018-10-03
  8. 一年前后的日期
    1
    2
    3
    4
    5
    6
    7
    8
    9
    LocalDate today = LocalDate.now();  
    System.out.println("今天的日期是:" + today);
    LocalDate previousYear = date.minus(1,ChronoUnit.YEARS);
    System.out.println("一年前的日期是:" + previousYear);
    LocalDate nextYear = date.plus(1,ChronoUnit.YEARS);
    System.out.println("一年后的日期是:" + nextYear);
    // 今天的日期是:2018-09-26
    // 一年前的日期是:2017-09-26
    // 一年后的日期是:2019-09-26
  9. 使用时钟
    1
    2
    3
    4
    //返回当前时间根据系统时钟和UTC
    Clock clock = Clock.systemUTC();
    System.out.println("Clock:" + clock);
    // Clock:SystemClock[Z]
  10. 如何判断某个日期在另一个日期的前面还是后面
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LocalDate today = LocalDate.now();
    System.out.println("今天的日期是:" + today);
    LocalDate tommorrow = today.plus(1, ChronoUnit.DAYS);
    System.out.println("明天的日期是:" + tommorrow);
    System.out.println("日期:" + tommorrow + "是否在日期:" + today + "之前?" + tommorrow.isBefore(today));
    System.out.println("日期:" + tommorrow + "是否在日期:" + today + "之后?" + tommorrow.isAfter(today));
    // 今天的日期是:2018-09-26
    // 明天的日期是:2018-09-27
    // 日期:2018-09-27是否在日期:2018-09-26之前?false
    // 日期:2018-09-27是否在日期:2018-09-26之后?true
  11. 处理不同的时区
    1
    2
    3
    4
    5
    LocalDateTime localDateTime = LocalDateTime.now();
    ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("ACT"));
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,zoneId);
    System.out.println("现在时区的时间和在特定时区时间:" + zonedDateTime);
    // 现在时区的时间和在特定时区时间:2018-09-26T23:15:52.325+09:30[Australia/Darwin]
  12. 如何表示固定的日期,比如信用卡过期时间
    1
    2
    3
    4
    5
    6
    YearMonth currentYearMoth = YearMonth.now();
    System.out.printf("这个月的年月 %s 有 %d 天%n", currentYearMoth,currentYearMoth.lengthOfMonth());
    YearMonth creditCardExpiry = YearMonth.of(2018,Month.OCTOBER);
    System.out.printf("您输入的年月日期是 %s %n",creditCardExpiry);
    // 这个月的年月 2018-09 有 30 天
    // 您输入的年月日期是 2018-10
  13. 如何在java8中检查闰年
    1
    2
    3
    LocalDate today = LocalDate.now();
    System.out.printf("%s 年是不是闰年:%s", today, today.isLeapYear());
    // 2018-09-26 年是不是闰年:false
  14. 两个日期之间包含多少天,多少月
    1
    2
    3
    4
    LocalDate dates = LocalDate.of(2018, Month.OCTOBER, 15);
    Period period = Period.between(today, dates);
    System.out.printf("日期 %s 和日期 %s相差 %s天", today, dates, period.getDays());
    // 日期 2018-09-26 和日期 2018-10-15相差 19天
  15. 带时区的日期与时间
    1
    2
    3
    4
    5
    LocalDateTime dateTime = LocalDateTime.of(2018,Month.SEPTEMBER,26,23,51);
    ZoneOffset offset = ZoneOffset.of("+05:30");
    OffsetDateTime offsetDateTime = OffsetDateTime.of(dateTime,offset);
    System.out.println("日期和时间在时区上的偏移时间:" + offsetDateTime);
    // 日期和时间在时区上的偏移时间:2018-09-26T23:51+05:30
  16. 获取当前时间戳
    1
    2
    3
    Instant timeStamp = Instant.now();
    System.out.println("当前的时间戳是:" + timeStamp);
    // 当前的时间戳是:2018-09-26T16:01:12.053Z
  17. 使用预定义的格式器来对日期进行解析/格式化
    1
    2
    3
    4
    String dayAfterTomorrow = "20180927";
    LocalDate formatted = LocalDate.parse(dayAfterTomorrow, DateTimeFormatter.BASIC_ISO_DATE);
    System.out.printf("字符 %s 格式化后的日期格式是 %s %n", dayAfterTomorrow, formatted);
    // 字符 20180927 格式化后的日期格式是 2018-09-27
  18. 使用自定义的格式器来解析日期
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String day = "09 27 2018";
    try {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy");
    LocalDate date = LocalDate.parse(day, formatter);
    System.out.printf("字符 %s 转换成功后的日期是 %s %n", day, date);
    // 字符 09 27 2018 转换成功后的日期是 2018-09-27
    } catch (DateTimeException ex) {
    System.out.printf("%s 不能被转换; %n", day);
    ex.printStackTrace();
    }
  19. 对日期进行格式化,转换成字符串
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LocalDateTime arrivalDate = LocalDateTime.now();
    try {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM dd yyyy HH:mm s");
    String landing = arrivalDate.format(formatter);
    System.out.printf("时间日期 %s 转换后的字符串为 %s %n", arrivalDate, landing);
    // 时间日期 2018-09-27T00:19:22.974 转换后的字符串为 09 27 2018 00:19 22
    } catch (DateTimeException ex) {
    System.out.printf("%s 格式转换错误 %n",arrivalDate);
    ex.printStackTrace();
    }

  20. 如何取得某月的最后一天
    1
    2
    3
    4
    5
    6
    7
    LocalDate date = LocalDate.now();
    LocalDate firstDay = LocalDate.of(date.getYear(),date.getMonth(),1);
    LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println("本月第一天是:" + firstDay);
    System.out.println("本月最后一天是:" + lastDay);
    // 本月第一天是:2018-09-01
    // 本月最后一天是:2018-09-30

Java 8 日期特性

日期/时间API的几个关键点

经过上面的例子,我们已经对java8的时间日期有了一定的了解,现在回顾一下

日期/时间特性

Java 8 日期/时间 API 是 JSR-310 的实现,它的实现目标是克服旧的日期时间实现中所有的缺陷,新的日期/时间API 的一些设计原则是:

日期/时间 API 包解释

这套新的API中的这五个类

java.time 包下的方法概览

方法名 说明
Of 静态工厂方法
parse 静态工厂方法,关注于解析
get 获取某些东西的值
is 检查某些东西的是否是 true
with 不可变的 setter 等价物
plus 加一些量到某个对象
minus 从某个对象减去一些量
to 转换到另一个类型
at 把这个对象与另一个对象组合起来

总结

Java.time java.util.Calendar 以及 Date
流畅的 API 不流畅的 API
实例不可变 实例可变
线程安全 非线程安全

last update time 2022-03-03