Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
问题1. 你将使用哪个类来存储你的生日,包括年,月,日,秒和纳秒?
答案1. 很可能你会使用 LocalDateTime 类。要考虑特定时区,可以使用 ZonedDateTime 类。这两个类都将日期和时间跟踪为纳秒精度,并且当与 Period 结合使用时,这两个类使用基于人的单位的组合(例如年,月和日)来给出结果。
问题2. 给定一个随机日期,你如何找到上周四的日期?
答案2. 你可以使用 TemporalAdjuster 的 previous 方法:
LocalDate date = ...; System.out.printf("The previous Thursday is: %s%n", date.with(TemporalAdjuster.previous(DayOfWeek.THURSDAY)));
问题3. ZoneId 和 ZoneOffset 之间有什么区别?
答案3. ZoneId 和 ZoneOffset 都跟踪格林威治/ UTC 时间的偏移量,但 ZoneOffset 类仅跟踪格林威治/ UTC 的绝对偏移量。ZoneId 类还使用 ZoneRules 来确定偏移量在特定时间和地区的变化情况。
问题4. 如何将 Instant 转换为 ZonedDateTime?你如何将 ZonedDateTime 转换为 Instant?
答案4. 你可以使用 ZonedDateTime.ofInstant 方法将 Instant 转换为 ZonedDateTime。你还需要提供 ZoneId:
ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
或者,你可以使用 Instant.atZone 方法:
ZonedDateTime zdt = Instant.now().atZone(ZoneId.systemDefault());
你可以使用 ChronoZonedDateTime 接口中的 toInstant 方法,由 ZonedDateTime 类实现,以转换为 ZonedDateTime 到 Instant:
Instant inst = ZonedDateTime.now().toInstant();
练习1. 写一个例子,在给定年份,报告该年内每个月的长度。
答案1. 有关解决方案,请参阅 MonthsInYear.java
。
练习2. 写一个例子,对于当年的某个月,列出该月的所有星期一。
答案2. 有关解决方案,请参阅 ListMondays.java
。
练习3. 写一个例子来测试给定日期是否在 13 号星期五。
答案3. 有关解决方案,请参阅 Superstitious.java
和 FridayThirteenQuery.java
。