java - Calendar.DAY_OF_WEEK_IN_MONTH 相当于 java8 中的 ZonedDateTime

标签 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 号到 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] is on Thanksgiving

关于java - Calendar.DAY_OF_WEEK_IN_MONTH 相当于 java8 中的 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56584758/

相关文章:

datetime - 从频率 = 23 的不规则 (as.Date) 时间序列创建规则时间序列

Android Studio中的Java URLConnection.setRequestProperty似乎没有做任何事情

Java I/O 文件流问题

java - 使用我的自签名证书创建一个 KeyStore 实例

java - 如何使用迭代器显示列表中的项目列表

java - 如何在 WindowsFileSystem 类中配置 defaultDirectory

perl - 无法通过包定位对象方法 "strftime"

python - 将 Pandas 数据框汇总为半小时一次

java - LongSummaryStatistics 为什么要实现 IntConsumer?

java - 起初它说我的输出代码无法访问,现在它说有错误。有人可以帮我弄清楚我的错误在哪里吗?