模拟器与真实设备 return 与日期不同的 weekOfYear

Simulator vs real device return different weekOfYear from Date

我有一个 Date 对象,我需要从中获取 weekOfYear 并且我的代码在真实设备上工作得很好,但如果我 select 星期天,它在模拟器上提前一周。一周中的所有其他日子都可以正常工作。

我知道模拟器使用mac的日期和时间,但是mac和真机都设置为自动,相同的时区,相同的设置。

let wednesday: Date? = calendar.date(from: DateComponents(year: 2020, month: 10, day: 14))
let sunday: Date? = calendar.date(from: DateComponents(year: 2020, month: 10, day: 18))
    
print("\(wednesday?.weekOfYear) vs \(sunday?.weekOfYear)")
// In the simulator this prints Optional(42) vs Optional(43)
// On a real device this prints Optional(42) vs Optional(42)

知道我做错了什么吗?它与夏令时有什么关系吗?日期对象本身打印为 2020-10-13 23:00:00 +0000 和 2020-10-17 23:00:00 +0000,但是尽管如此,为 DST 添加 1h 应该意味着它仍然是 18 号星期日。

提前感谢您的任何提示。

更新

感谢大家的评论,帮我找到了问题。

我使用的日历是这样的:

var calendar: Calendar {
    var calendar = Calendar(identifier: .iso8601)
    calendar.firstWeekday = 2
    return calendar
}

我有一个日期扩展来获取 .weekday,如下所示:

extension Date {
    var weekday: Int { return Calendar.current.component(.weekday, from: self) }
}

所以问题是我没有使用我的 iso8601 日历,该日历从星期一开始。我将其更改为我的日历,现在可以使用了。

正如我在评论中提到的,问题出在您使用的日历 ISO8601 上。该日历的第一个工作日是星期一,而当前日历(可能是公历)的第一个工作日是星期日。

可能模拟器和真机有区别。 因为它有不同的语言环境时区,请确保它们相同。