Swift DateComponents weekOfMonth 返回错误值

标签 swift cocoa nscalendar nsdatecomponents

我正在开发一个显示当前月份的日历 View (Cocoa macOS 应用程序)。当我尝试计算给定日期的周数时,我会根据日历和区域设置得到不同的结果。

对于 2021 年 1 月 1 日,某些调用返回第 0 周,其他调用返回第 1 周:

    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd"

    let jan2021 = formatter.date(from: "2021-01-01")!

    var deCalendar = Calendar(identifier: .gregorian)
    deCalendar.locale = Locale(identifier: "de_de")
    var usCalendar = Calendar(identifier: .gregorian)
    usCalendar.locale = Locale(identifier: "en_us")
    var deIsoCalendar = Calendar(identifier: .iso8601)
    deIsoCalendar.locale = Locale(identifier: "de_de")
    var usIso = Calendar(identifier: .iso8601)
    usIso.locale = Locale(identifier: "en_us")

    deCalendar.component(.weekOfMonth, from: jan2021)    // 0 
    deIsoCalendar.component(.weekOfMonth, from: jan2021) // 0
    usCalendar.component(.weekOfMonth, from: jan2021)    // 1 ??
    usIso.component(.weekOfMonth, from: jan2021)         // 0

2021 年 1 月 1 日是星期五,因此我预计“月份中的一周”为 0(或 1,具体取决于特定 API 是否为零 -是否基于)。

对于 2021 年 2 月 1 日(星期一),以上所有调用都会返回第 1 周!

只是为了好玩,2021 年 1 月 31 日:美国/公历返回“第 6 周”,所有其他日历返回“第 4 周”。

错误?,功能?,我缺少什么?

供引用:

calendar

最佳答案

这取决于特定日历中的两件事:

  • 第一周最小天数
  • 第一周

如果您查看您使用的日历

deCalendar: minimumDaysInFirstWeek=4, firstWeekday=2
deIsoCalendar: minimumDaysInFirstWeek=4, firstWeekday=2
usCalendar: minimumDaysInFirstWeek=1, firstWeekday=1
usIso: minimumDaysInFirstWeek=4, firstWeekday=2

因此,3 个日历需要至少 4 天才能将其视为第一周,并且它们从星期一(美国语言环境中的第 2 天)开始。因此,每周 3 天不会被视为第一周。

日历 3 一周仅要求 1 天,因此即使 1 天也是一周。

关于Swift DateComponents weekOfMonth 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65094343/

相关文章:

ios - 引用不可见的单元格

macos - 如何为 NSCollectionView 的 "Overshoot"背景着色

swift - 为什么在 Swift Playground 中执行的结果与在应用程序中执行的结果不同?

cocoa - 计算当前时间和下一个事件之间的秒数

objective-c - 如何检查控件是否正在退出第一响应者或成为第一响应者?

ios - 在IOS SDK中获取星期日期

swift - 在范围内使用未解析的标识符

ios - 具有渐变边框和圆角的 UIButton

swift - 从 NSUserDefaults (Swift) 中的 double 值中检索日期

objective-c - NSSavePanel 选择部分文件名