问题和练习的答案:日期时间 API
Questions
问题 1 。您将使用哪一类来存储年,月,日,秒和纳秒的生日?
答案 1 。您很可能会使用LocalDateTime
类。要考虑特定timezone,您可以使用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
都跟踪距 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
类实现的ChronoZonedDateTime
interface中使用toInstant
方法,以将ZonedDateTime
转换为Instant
:
Instant inst = ZonedDateTime.now().toInstant();
Exercises
练习 1 。编写一个示例,对于给定的年份,报告该年份内每个月的 Long 度。
答案 1 。解决方案请参见MonthsInYear.java。
练习 2 。编写一个示例,该示例针对当年的给定月份列出该月的所有星期一。
答案 2 。解决方案请参见ListMondays.java。
练习 3 。编写一个示例,测试给定日期是否在 13 号星期五发生。
答案 3 。有关解决方案,请参见Superstitious.java和FridayThirteenQuery.java。