java - 在 java.time 中,为什么 WeekFields.SUNDAY_START 会

我确定我只是在这里遗漏了一些东西,但它一直在躲避我。

为什么 SUNDAY_START 会为 2020-12-29 生成周数 1 而不是 53?

是因为我误解了 Oracle 文档所说的内容吗?还是我还漏掉了什么?

详情

前往 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/temporal/WeekFields.html#SUNDAY_START显示 SUNDAY_START 似乎遵循与上述相同的规则。如果我使用下面的代码...

ZonedDateTime zdt = ZonedDateTime.ofInstant(/* representation of Dec. 29, 2020 */, ZoneId.of("UTC"));
 
TemporalField wn = WeekFields.SUNDAY_START.weekOfWeekBasedYear();
    
int weekNumber = zdt.get(wn);

然后“weekNumber”为 1,而我预计它为 53。

如果我改用 WeekFields.ISO,我得到 53;然而,ISO 的定义是它使用星期一作为一周的开始,这在我正在处理的情况下是不正确的,我不确定 future 仅使用 ISO 而不是 SUNDAY_START 的后果。

我错过了什么?

答案

根据下面的评论(感谢 Basil 和 Andreas),我确实误读了 Oracle 文档,其中指出:

定义为从星期日开始并且一个月中至少有 1 天。

“一个月中至少有 1 天”是让我在新年的背景下陷入循环的部分。

根据下面的说明,很明显,由于 2021 年 1 月 1 日是星期五,而 SUNDAY_START 周从星期日开始,因此在这种情况下,本周实际上是第 1 周。

动机

我最初问这个问题是为了更好地理解 SUNDAY_START。这样做的动机是找到一种方法来重新创建 MySQL 的 WEEK()“模式 6”(即,一周的星期日开始,第一周是今年有 4 天或更多天的第一周)。

我忘记了创建自定义周字段的功能,该字段具有指定的开始日期和该月中包含的最少天数。

不过,我还是很感激能消除我对 SUNDAY_START 的 Javadoc 的误解,我希望这篇文章对以后的人有用。

感谢大家的评论和回答,对于最初的任何困惑,我深表歉意。

最佳答案

https://savvytime.com/week-number是错误的

当你显示 Country: United States, Year: 2020 时,它显示:

Week 53   December 27, 2020   January 2, 2021   Current Week

当你显示 Country: United States, Year: 2021 时,它显示:

Week 1    December 27, 2020   January 2, 2021   Current Week

第 53 周第 1 周怎么可能是同一个日期范围?它不能。该网站已损坏。


更新: 来自评论:

needing a Java datetime "equivalent" of MySQL's WEEK() function using mode 6

这很简单。模式 6 定义为:

  • 一周的第一天:星期日
  • 第 1 周是第一周...今年有 4 天或更多天

所以你得到一个 WeekFields:

WeekFields weekMode6 = WeekFields.of(/*firstDayOfWeek=*/DayOfWeek.SUNDAY,
                                     /*minimalDaysInFirstWeek=*/4);

作为引用,两个预定义的 WeekFields 实例定义为:

ISO         = new WeekFields(DayOfWeek.MONDAY, 4);
SUNDAY_START = WeekFields.of(DayOfWeek.SUNDAY, 1);

关于java - 在 java.time 中,为什么 WeekFields.SUNDAY_START 会为 2020-12-29 生成周数 1 而不是 53?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65499411/

相关文章:

swift - 如何在 SwiftUI 上启用核心数据加密?

java - JDBC 向数据库中插入变量

angular - 引用错误 : Can't find variable: globalThis

python - 如何从 Python 字典中的键中删除尾随空格?

powershell - 如何显示使用扩展参数调用的命令行

java - 问题启动 Cassandra。 Java 运行时环境 : 检测到 fatal erro

aws-cloudformation - AWS Proton 与 CloudFormation

python - 模块未找到错误 : No module named 'psycopg2' in i

node.js - 如何动态地从 Firestore 数组中删除多个元素?

r - 根据条件为每个 ID 创建不同数量的行