在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java8 新的日期和时间 API

2017-2-7 13:42| 发布者: zhangjf| 查看: 490| 评论: 0

摘要: 原文 http://renchx.com/java8-localdate/ 时间线 在 Java 当中,一个 Instant 对象表示时间轴上的一个点。并且我们可以计算两个时间点之间的时间量。 @Test public void test1() throws Exception { ...
原文 http://renchx.com/java8-localdate/ 时间线

在 Java 当中,一个 Instant 对象表示时间轴上的一个点。并且我们可以计算两个时间点之间的时间量。

  1. @Test
  2. public void test1() throws Exception {
  3. // Instant.now() 获取当前时间瞬时点
  4. Instant begin = Instant.now();
  5. System.out.println(begin);
  6. Thread.sleep(200);
  7. Instant end = Instant.now();
  8. System.out.println(end);
  9. // Duration表示两个瞬时点之间的持续时间
  10. Duration duration = Duration.between(begin, end);
  11. System.out.println(duration.toMillis());
  12. // 可以对 Duration 和 Instant 进行数学操作
  13. System.out.println(end.plusSeconds(20));
  14. System.out.println(duration.plusMillis(500).toMillis());
  15. }
复制代码

本地日期

本地日期/时间表示一个日期或时间,但是不关联任何时区信息。

  1. @Test
  2. public void test2() {
  3. // LocalDate.now() 获取本地今天日期
  4. LocalDate localDate = LocalDate.now();
  5. System.out.println(localDate);
  6. // LocalDate.of() 创建日期 2015-12-22
  7. LocalDate localDate2 = LocalDate.of(2015, 12, 22);
  8. System.out.println(localDate2);
  9. System.out.println(localDate2.plusDays(1));
  10. System.out.println(localDate.isBefore(localDate2));
  11. LocalDate localDate3 = localDate2.plus(Period.ofDays(3));
  12. System.out.println(localDate.isBefore(localDate3));
  13. System.out.println(localDate2.until(localDate3, ChronoUnit.DAYS));//返回两个本地日期时间的距离
  14. System.out.println(localDate3.getDayOfWeek());//星期几
  15. }
复制代码

两个瞬时点 Instant 之间的距离就是一个持续时间 Duration。对于本地日期对应的对象就是时段 Period。

日期校正器

如果我们需要进行调度,例如每个月的第一个周二这样的日期。 TemporalAdjusters 类提供了很多静态方法来进行常用的校正。

  1. @Test
  2. public void test3() {
  3. LocalDate localDate = LocalDate.of(2015, 1, 1).with(
  4. TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));// 从指定日期开始的后一个星期几
  5. System.out.println(localDate);
  6. LocalDate localDate2 = localDate.with(TemporalAdjusters.previous(DayOfWeek.TUESDAY));// 指定日期的前一个星期几
  7. LocalDate localDate3 = localDate.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));// 指定日期的后一个星期几
  8. System.out.println(localDate2);
  9. System.out.println(localDate3);
  10. LocalDate localDate4 = localDate.with(TemporalAdjusters.dayOfWeekInMonth(3,
  11. DayOfWeek.TUESDAY));// 第三个周二
  12. System.out.println(localDate4);
  13. LocalDate localDate5 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.TUESDAY));
  14. System.out.println(localDate5);
  15. TemporalAdjuster Next_WorkDay = w -> {//自定义校正器
  16. LocalDate resultDate = (LocalDate) w;
  17. do {
  18. resultDate = resultDate.plusDays(1);
  19. } while (resultDate.getDayOfWeek().getValue() >= 6);
  20. return resultDate;
  21. };
  22. }
复制代码

本地时间

LocalTime 表示一天当中的某个时间,例如 15:00.

  1. @Test
  2. public void test4() {
  3. LocalTime localTime = LocalTime.now();
  4. LocalTime localTime2 = LocalTime.of(12, 24);
  5. System.out.println(localTime);
  6. System.out.println(localTime2);
  7. // 其他 api 与 LocalDate 类似
  8. LocalDateTime localDateTime = LocalDateTime.now();
  9. LocalDateTime localDateTime2 = LocalDateTime.of(2015, 12, 22, 3, 14, 23);
  10. System.out.println(localDateTime);
  11. System.out.println(localDateTime2);
  12. // 其他 api 与 LocalDate 类似
  13. }
复制代码

格式化和解析

DateTimeFormatter 提供了三种格式化的方法来打印日期:

预定义的标准格式 语言相关的格式 自定义格式
  1. @Test
  2. public void test5() {
  3. LocalDateTime localDateTime = LocalDateTime.now();
  4. System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));// 预定义标准格式
  5. System.out.println(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));// 预定义标准格式
  6. System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
  7. .format(localDateTime));// 语言相关格式
  8. System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(
  9. localDateTime));// 语言相关格式
  10. System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).format(
  11. localDateTime));// 语言相关格式
  12. System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format(
  13. localDateTime));// 语言相关格式,一般使用这个
  14. System.out
  15. .println(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(localDateTime));// 自定义
  16. }
复制代码

遗留代码操作

Instant 类似于 java.util.Date 类,在 java8 当中 java.util.Date 新增两个方法:toInstant,还有 from 方法来相互转换。

【参考资料】

写给大忙人看的Java SE 8

---EOF---


最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 09:12

Copyright 2015-2025 djqfx

返回顶部