文档

Java™ 教程-Java Tutorials 中文版
Trail: Date Time
Lesson: Standard Calendar
主页>日期时间>标准日历

问题和练习的答案:日期时间 API

问题

问题1. 你将使用哪个类来存储你的生日,包括年,月,日,秒和纳秒?

答案1. 很可能你会使用 LocalDateTime 类。要考虑特定时区,可以使用 ZonedDateTime 类。这两个类都将日期和时间跟踪为纳秒精度,并且当与 Period 结合使用时,这两个类使用基于人的单位的组合(例如年,月和日)来给出结果。

问题2. 给定一个随机日期,你如何找到上周四的日期?

答案2. 你可以使用 TemporalAdjusterprevious 方法:

LocalDate date = ...;
System.out.printf("The previous Thursday is: %s%n",
          date.with(TemporalAdjuster.previous(DayOfWeek.THURSDAY)));

问题3. ZoneIdZoneOffset 之间有什么区别?

答案3. ZoneIdZoneOffset 都跟踪格林威治/ 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 类实现,以转换为 ZonedDateTimeInstant

Instant inst = ZonedDateTime.now().toInstant();

练习

练习1. 写一个例子,在给定年份,报告该年内每个月的长度。

答案1. 有关解决方案,请参阅 MonthsInYear.java

练习2. 写一个例子,对于当年的某个月,列出该月的所有星期一。

答案2. 有关解决方案,请参阅 ListMondays.java

练习3. 写一个例子来测试给定日期是否在 13 号星期五。

答案3. 有关解决方案,请参阅 Superstitious.javaFridayThirteenQuery.java


Previous page: Questions and Exercises: Date-Time API