在我的 Playground 中,Calendar.current.firstWeekday == 1,我将其解释为
“星期一是我居住的地方(瑞典)一周的第一天”
但是当我运行模拟器时,Calendar.current.firstWeekday == 2,我不明白为什么! (在模拟器的设置中,我已将区域设置为“瑞典”)。
let c = Calendar.current
print(c) // prints "gregorian"
let first = Calendar.current.firstWeekday // this is 2 !!!
问题: 为什么 Calendar.current.firstWeekday == 2 以及如何解决这个问题?
我将其解释为
我相信你的解释是错误的。我不确定框架如何分配一周中的几天,但从你的问题来看,我相信它们从 1 到 7,其中 1 是星期日,2 是星期一,依此类推。这些是静态的,不会随着您的设置而改变。
firstWeekday
属性告诉您在您的语言环境中一周从哪一天开始。在默认区域设置美国,一周从星期日开始。
您无法“修复此问题”,因为没有任何问题,该属性可以为您提供在绘制日历时特别有用的信息。
在 Playground 中,区域设置默认设置为美国本地化。因此,它表示一周的第一天是 1/Sunday,这就是美国的情况。
当您在模拟器中运行已设置为 Sweeden 的代码时,系统会告诉您一周的第一天是 2/星期一,瑞典就是这种情况。
差异是由于 Playground 默认为美国本地化所致。如果您希望游乐场像在瑞典一样,则必须将其放入代码中。
以防万一。 要获取所有可用国家/地区第一个工作日的所有可能变化:
选择您的区域设置或获取最新信息,然后享受结果。
let locale = Locale(identifier: "en_US")
Locale.availableIdentifiers
.map { Locale(identifier:$0) }
.reduce([:]) { result, value -> [Int: [String]] in
var newResult = result
let weekday = value.calendar.firstWeekday
if var existing = newResult[weekday] {
existing.append(value.identifier)
newResult[weekday] = existing
return newResult
}
newResult[weekday] = [value.identifier]
return newResult
}
.sorted { $0.key < $1.key }
.forEach { weekday, locales in
let locDescr = locales.map {
locale.localizedString(forIdentifier: $0)
}
.compactMap { $0 }
print("Weekday \(weekday) :\n \(locDescr)\n\n")
}
来自firstWeekday的Apple开发者文档:
firstWeekday 的默认值因日历和区域设置而异。您的应用程序可以重置该值。 工作日单位以一为基础。对于公历和 ISO 8601 日历,1 是星期日。