【问题标题】:Swift DateComponents weekOfMonth returns wrong valueSwift DateComponents weekOfMonth 返回错误值
【发布时间】:2021-03-13 14:25:57
【问题描述】:

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

对于 2021 年 1 月 1 日,一些电话返回 week 0,另一些电话返回 week 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 日,即星期一,以上所有调用均返回 week 1

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

Bug?,功能?,我错过了什么?

供参考:

【问题讨论】:

  • 为什么 2 月 1 日的 weekOfMonth 不是 1? 1 月 31 日是星期日,这是美国一周的第一天

标签: swift cocoa nscalendar nsdatecomponents


【解决方案1】:

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

  • minimumDaysInFirstWeek
  • firstWeekday

如果您查看您使用的日历

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 天也是一周。

【讨论】:

  • 感谢您对此有所了解。这将解释它。虽然我会说这有点不直观。我原以为一周的定义只取决于一周的第一天,这在不同国家/地区已经不同。但是那么定义什么被认为是第一周也是本地化的?谁会想到...
猜你喜欢
  • 2021-05-29
  • 2017-01-22
  • 1970-01-01
  • 2021-08-17
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2022-08-04
相关资源
最近更新 更多