Calendar.DAY_OF_WEEK_IN_MONTH(相当于Java8中的ZonedDateTime)

时间:2019-06-13 16:19:43

标签: java datetime java-8 calendar

我正在尝试检查感恩节(11月4日星期四)。
我有ZonedDateTime作为2019-11-23T08:43:14.699-07:00[America/Los_Angeles]

如何使用Java 8 ZonedDateTime API检查是否是第4个星期四

在日历中,我们有Calendar.DAY_OF_WEEK_IN_MONTH用于计算一个月中的星期数。 ZonedDateTime中有这样的东西吗?

我使用日历。

// check Thanksgiving (4th Thursday of November)
    if (cal.get(Calendar.MONTH) == Calendar.NOVEMBER
        && cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) == 4
        && cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
        return false;
    }

如何使用ZonedDateTime实现这一目标?

1 个答案:

答案 0 :(得分:2)

您需要的是每月的一致星期。该月的第一个对齐周是从该月的1号到7号,因此无论该月是在一周的哪一天开始,都包含该月的第一个星期四。第二个对齐的星期是该月的8到14,依此类推。

    ZonedDateTime zdt = ZonedDateTime.parse("2019-11-23T08:43:14.699-07:00[America/Los_Angeles]");
    if (zdt.getMonth().equals(Month.NOVEMBER)
            && zdt.get(ChronoField.ALIGNED_WEEK_OF_MONTH) == 4
            && zdt.getDayOfWeek().equals(DayOfWeek.THURSDAY)) {
        System.out.println("" + zdt + " is on Thanksgiving");
    }

由于感恩节是今年11月28日,因此上述摘要测试(11月23日)不会打印任何内容。试试合适的日子吧:

    ZonedDateTime zdt = ZonedDateTime.parse("2019-11-28T17:34:56.789-07:00[America/Los_Angeles]");
  

2019-11-28T16:34:56.789-08:00 [America / Los_Angeles]在感恩节上