时间 - 图1

jdk8 时间

  1. //一个时间表示
  2. String stringDate = "2020-01-02 22:00:00";
  3. //初始化三个时区
  4. ZoneId chinaTimeZone = ZoneId.of("Asia/Shanghai");
  5. ZoneId americaTimeZone = ZoneId.of("America/New_York");
  6. ZoneOffset customTimeZone = ZoneOffset.ofHours(9);
  7. // 字面量+时区 转 时间
  8. // 1.方式一
  9. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
  10. ZonedDateTime zonedDateTime = ZonedDateTime.of(
  11. LocalDateTime.parse(stringDate, formatter),
  12. chinaTimeZone
  13. );
  14. // 2020-01-02T22:00+08:00[Asia/Shanghai]
  15. System.out.println(zonedDateTime);
  16. // 2.方式二
  17. DateTimeFormatter formatterWithTimeZone = DateTimeFormatter
  18. .ofPattern("yyy-MM-dd HH:mm:ss")
  19. .withZone(customTimeZone);
  20. ZonedDateTime z = ZonedDateTime.parse(
  21. stringDate,
  22. formatterWithTimeZone);
  23. // 2020-01-02T22:00+09:00
  24. System.out.println(z);
  25. // 时间转字面量
  26. String stringTime = z.format(formatterWithTimeZone.withZone(americaTimeZone));
  27. // 2020-01-02 08:00:00
  28. System.out.println(stringTime);
  1. // 格式化字面量 formatter 的另一种方式
  2. DateTimeFormatter matter = new DateTimeFormatterBuilder()
  3. .appendValue(ChronoField.YEAR) //年
  4. .appendLiteral("/")
  5. .appendValue(ChronoField.MONTH_OF_YEAR) //月
  6. .appendLiteral("/")
  7. .appendValue(ChronoField.DAY_OF_MONTH) //日
  8. .appendLiteral(" ")
  9. .appendValue(ChronoField.HOUR_OF_DAY) //时
  10. .appendLiteral(":")
  11. .appendValue(ChronoField.MINUTE_OF_HOUR) //分
  12. .appendLiteral(":")
  13. .appendValue(ChronoField.SECOND_OF_MINUTE) //秒
  14. .appendLiteral(".")
  15. .appendValue(ChronoField.MILLI_OF_SECOND) //毫秒
  16. .toFormatter()
  17. ;
  18. String str = "2013/1/2 8:1:10.777";
  19. LocalDateTime dateTime = LocalDateTime.parse(str, matter);
  20. // 2013-01-02T08:01:10.777
  21. System.out.println(dateTime);

时间转换

jdk8 之前

  • 注意 int 溢出

    1. Date today = new Date();
    2. // 注意加 L |
    3. Date nextMonth = new Date(today.getTime() + 30L * 1000 * 60 * 60 * 24);
    4. System.out.println(today);
    5. System.out.println(nextMonth);
  • 推荐

    1. Calendar c = Calendar.getInstance();
    2. c.setTime(new Date());
    3. c.add(Calendar.DAY_OF_MONTH, 30);
    4. System.out.println(c.getTime());

jdk8

api 进行日期计算

  1. System.out.println(LocalDate.now()
  2. // 减少一天的三种方式
  3. .minus(Period.ofDays(1))
  4. .minus(1, ChronoUnit.DAYS)
  5. .minusDays(1));

with() + TemporalAdjusters 进行日期调节

使用 TemporalAdjusters.firstDayOfMonth 得到当前月的第一天;
使用 TemporalAdjusters.firstDayOfYear() 得到当前年的第一天;
使用 TemporalAdjusters.previous(DayOfWeek.SATURDAY) 得到上一个周六;
使用 TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY) 得到本月最后一个周五。

with() + lambda 表达式进行自定义的时间调整

  1. System.out.println(LocalDateTime.now().with((time) -> {
  2. time.plus(1, ChronoUnit.DAYS);
  3. return time;
  4. }));

query() + lambda 表达式进行日期筛选

  1. todo

计算时间差

  1. System.out.println(
  2. ChronoUnit.MINUTES.between(LocalDateTime.now(),
  3. LocalDateTime.now().plus(1, ChronoUnit.DAYS)
  4. ));