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

Questions

问题 1 。您将使用哪一类来存储年,月,日,秒和纳秒的生日?

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

问题 2 。给定一个随机日期,您将如何找到上一个星期四的日期?

答案 2 。您可以使用TemporalAdjusterprevious方法:

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

问题 3ZoneIdZoneOffset有什么区别?

答案 3ZoneIdZoneOffset都跟踪距 Greenwich/ UTC 时间的offset量,但是ZoneOffset类仅跟踪距 Greenwich/UTC 时间的绝对offset量。 ZoneId类还使用ZoneRules来确定offset量在年份和区域的特定时间如何变化。

问题 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());

您可以在ZonedDateTime类实现的ChronoZonedDateTimeinterface中使用toInstant方法,以将ZonedDateTime转换为Instant

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

Exercises

练习 1 。编写一个示例,对于给定的年份,报告该年份内每个月的 Long 度。

答案 1 。解决方案请参见MonthsInYear.java

练习 2 。编写一个示例,该示例针对当年的给定月份列出该月的所有星期一。

答案 2 。解决方案请参见ListMondays.java

练习 3 。编写一个示例,测试给定日期是否在 13 号星期五发生。

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