【问题标题】:How to generate an ordered list of DateComponents.weekday values for the current locale如何为当前语言环境生成 DateComponents.weekday 值的有序列表
【发布时间】:2023-01-25 15:30:39
【问题描述】:
来自 DateComponents.weekday 的文档
工作日单位是从 1 到 n 的数字,其中 n 是一周中的天数。例如,在公历中,n 为 7,星期日用 1 表示。
来自Calendar.firstWeekday
firstWeekday 的默认值因日历和区域设置而异……对于公历和 ISO 8601 日历,1 是星期日。
鉴于此信息,我们如何获得当前语言环境的工作日数组,例如
在澳大利亚返回 [2, 3, 4, 5, 6, 7, 1],并且
在美国返回 [1, 2, 3, 4, 5, 6, 7]
【问题讨论】:
标签:
swift
nscalendar
nsdatecomponents
【解决方案1】:
在主题的另一个变体中,我将其设为 Calendar 扩展名。例如,改编 Willeke 的answer:
extension Calendar {
/// Array of weekday values
///
/// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
func orderedWeekdays() -> [Int] {
Array(firstWeekday...7) + Array(1..<firstWeekday)
}
}
或者,您也可以获取工作日的范围,然后从中构建结果:
extension Calendar {
/// Array of weekday values
///
/// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
func orderedWeekdays() -> [Int] {
guard
let weekdays = range(of: .weekday, in: .weekOfYear, for: Date()),
let index = weekdays.firstIndex(of: firstWeekday)
else { return [] }
return Array(weekdays[index...]) + Array(weekdays[..<index])
}
}
【解决方案2】:
干得好:
extension DateComponents {
/// Returns an array of Int that represent the days of the week in the given calendar's locale
/// e.g. returns [2, 3, 4, 5, 6, 7, 1] in Australia
/// e.g. returns [1, 2, 3, 4, 5, 6, 7] in USA
static func orderedWeekdays(for calendar: Calendar) -> [Int] {
let firstWeekday = calendar.firstWeekday
return Array(firstWeekday...7) + Array(1..<firstWeekday)
}
}
编辑:它应该是一个Calendar 扩展名。参见 Rob 的 Answer。
【解决方案3】:
这就是我所做的,希望有更好的方法......
extension DateComponents {
/// Returns an array of Int that represent the days of the week in the given calendar's locale
/// e.g. returns [2, 3, 4, 5, 6, 7, 1] in Australia
/// e.g. returns [1, 2, 3, 4, 5, 6, 7] in USA
static func orderedWeekdays(for calendar: Calendar) -> [Int] {
let unorderedWeekdays: [Int] = Array(1...7)
var orderedWeekdays: [Int] = []
if var index = unorderedWeekdays.firstIndex(of: calendar.firstWeekday) {
while (orderedWeekdays.count < unorderedWeekdays.count) {
orderedWeekdays.append(unorderedWeekdays[index])
index += 1
if index >= unorderedWeekdays.count {
index = 0
}
}
} else {
orderedWeekdays = unorderedWeekdays
}
return orderedWeekdays
}
}