以前遇到日期都是直接百度,很不爽,现在总结一下。

提示:日期plus函数都是返回一个新值,原来的值不变。

常用类

LocalDate

  1. # 当前日期
  2. LocalDate.now()
  3. $ 2019-09-01
  4. # 新建日期
  5. LocalDate.of(1990, 10, 12);
  6. LocalDate.parse("2019-09-09") // 默认格式
  7. LocalDate.parse("20190909",DateTimeFormatter.ofPattern("yyyyMMdd")) // 指定格式
  8. # 日期属性
  9. LocalDate date = LocalDate.parse("2019-09-09");
  10. date.getYear(); // 2019
  11. date.getMonth().getValue(); // 9
  12. date.getDayOfMonth(); // 9
  13. # 第一天
  14. LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); // 当月第一天
  15. LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth()); // 下个月第一天
  16. LocalDate.now().with(TemporalAdjusters.firstDayOfNextYear()); // 下一年的第一天
  17. LocalDate.now().with(TemporalAdjusters.firstDayOfYear()); // 今年的第一天
  18. LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 当月第一个周一
  19. $ 2019-09-01
  20. $ 2019-10-01
  21. $ 2020-01-01
  22. $ 2019-01-01
  23. $ 2019-09-02
  24. # 最后一天
  25. LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); // 当月最后一天
  26. LocalDate.now().with(TemporalAdjusters.lastDayOfYear()); // 当年最后一天
  27. LocalDate.now().with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY)); // 当月最后一个周一
  28. $ 2019-09-30
  29. $ 2019-12-31
  30. $ 2019-09-30
  31. # 当月第几个周一
  32. LocalDate.now().with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY)) // 当月第二个周一
  33. $ 2019-09-09
  34. # 日期加减
  35. LocalDate.now().plusDays(1);
  36. LocalDate.now().plusMonths(1);
  37. LocalDate.now().plusWeeks(1);
  38. LocalDate.now().plusYears(1);
  39. # 日期比较和判断
  40. LocalDate.now().isLeapYear(); // 是否是闰年
  41. LocalDate.now().isAfter(LocalDate.now().plusDays(1)); // 日期比较
  42. LocalDate.now().isBefore(LocalDate.now().plusDays(1)); // 日期比较
  43. LocalDate.now().isEqual(LocalDate.now()); // 日期比较
  44. $ false
  45. $ false
  46. $ true
  47. $ true

LocalTime

  1. # 获取当前时间
  2. LocalTime.now(); // 10:08:32.132
  3. LocalTime.now().withNano(0); // 10:08:32
  4. # 指定时间
  5. LocalTime time = LocalTime.of(14, 10, 21); //14:10:21
  6. LocalTime time2 = LocalTime.parse("12:00:01"); // 12:00:01
  7. # 修改时间
  8. LocalTime.now().plusHours(1);
  9. LocalTime.now().plusMinutes(1);
  10. LocalTime.now().plusSeconds(1);
  11. LocalTime.now().plusNanos(1);
  12. # 日期比较
  13. now.isBefore(now.plusHours(1)) // true


LocalDateTime

集合了LocalDate和LocalTime,方法大部分都是共通的,比如 创建、修改。

Instant

类似 System.currentTimeMillis() 可以精确到纳秒,但是我测试的时候毫秒级别后面都是0。
我们可以用它来计算任务执行时间差。

  1. Instant start = Instant.now();
  2. for (int i = 0; i < 2000; i++) {
  3. Thread.sleep(1);
  4. }
  5. Instant end = Instant.now();
  6. Duration between = Duration.between(start, end);
  7. System.out.println(between.toMillis()); // 毫秒,也可以转换成day minutes

日期差值

可以使用until来计算,原生的Period不太符合我们的要求。但是要注意,两个日期类型要保持一致。

  1. LocalDateTime now = LocalDateTime.now();
  2. LocalDateTime now2 = now.plusHours(1);
  3. System.out.println(now.until(now2, ChronoUnit.HOURS));

日期转换

LocalDate转Date

  1. LocalDate nowLocalDate = LocalDate.now();
  2. Date date = Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());

LocalDateTime转Date

  1. LocalDateTime localDateTime = LocalDateTime.now();
  2. Date date = Date.from(localDateTime.atZone(ZoneOffset.ofHours(8)).toInstant());

Date转LocalDateTime(LocalDate)

  1. Date date = new Date();
  2. LocalDateTime localDateTime = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
  3. LocalDate localDate = date.toInstant().atZone(ZoneOffset.ofHours(8)).toLocalDate();

LocalDate转时间戳

  1. LocalDate localDate = LocalDate.now();
  2. long timestamp = localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();

LocalDateTime转时间戳

  1. LocalDateTime localDateTime = LocalDateTime.now();
  2. long timestamp = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();

时间戳转LocalDateTime(LocalDate)

  1. long timestamp = System.currentTimeMillis();
  2. LocalDate localDate = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDate();
  3. LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();

参考

Java 8中处理日期和时间示例

日期转换


这短短的一生我们最终都会失去,不放大胆一点,爱一个人、攀一座山、追一个梦!