为什么 Calendar.current.firstWeekday == 2?

问题描述 投票:0回答:4

在我的 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 以及如何解决这个问题?

swift ios-simulator
4个回答
27
投票

我将其解释为

我相信你的解释是错误的。我不确定框架如何分配一周中的几天,但从你的问题来看,我相信它们从 1 到 7,其中 1 是星期日,2 是星期一,依此类推。这些是静态的,不会随着您的设置而改变。

firstWeekday
属性告诉您在您的语言环境中一周从哪一天开始。在默认区域设置美国,一周从星期日开始。

您无法“修复此问题”,因为没有任何问题,该属性可以为您提供在绘制日历时特别有用的信息。


4
投票

在 Playground 中,区域设置默认设置为美国本地化。因此,它表示一周的第一天是 1/Sunday,这就是美国的情况。

当您在模拟器中运行已设置为 Sweeden 的代码时,系统会告诉您一周的第一天是 2/星期一,瑞典就是这种情况。

差异是由于 Playground 默认为美国本地化所致。如果您希望游乐场像在瑞典一样,则必须将其放入代码中。


1
投票

以防万一。 要获取所有可用国家/地区第一个工作日的所有可能变化:

选择您的区域设置或获取最新信息,然后享受结果。

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")
    }

0
投票

来自firstWeekday的Apple开发者文档:

firstWeekday 的默认值因日历和区域设置而异。您的应用程序可以重置该值。 工作日单位以一为基础。对于公历和 ISO 8601 日历,1 是星期日。

© www.soinside.com 2019 - 2024. All rights reserved.