Swift DateComponents weekOfMonth returns 错误值
Swift DateComponents weekOfMonth returns wrong value
我正在处理显示当前月份的日历视图(Cocoa macOS 应用程序)。当我尝试计算给定日期的周数时,我根据日历和区域设置得到不同的结果。
2021 年 1 月 1 日,部分电话 return 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 日,即星期一,以上所有调用 return week 1
!
仅供娱乐,2021 年 1 月 31 日:us/gregorian 日历 return 为“第 6 周”,所有其他日历为“第 4 周”。
错误?功能?我缺少什么?
供参考:
这取决于特定日历中的两件事:
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 天也是一周。
我正在处理显示当前月份的日历视图(Cocoa macOS 应用程序)。当我尝试计算给定日期的周数时,我根据日历和区域设置得到不同的结果。
2021 年 1 月 1 日,部分电话 return 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 日,即星期一,以上所有调用 return week 1
!
仅供娱乐,2021 年 1 月 31 日:us/gregorian 日历 return 为“第 6 周”,所有其他日历为“第 4 周”。
错误?功能?我缺少什么?
供参考:
这取决于特定日历中的两件事:
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 天也是一周。