问题描述
我有一个Date对象,我需要从中获取一个weekOfYear
,并且我的代码在真实设备上运行良好,但是如果我选择“星期日”,则它在模拟器上要提前一年。一周中的其他所有时间都可以正常工作。
我知道模拟器使用Mac的日期和时间,但是Mac和真实设备均设置为自动,相同时区,相同设置。
let wednesday: Date? = calendar.date(from: DateComponents(year: 2020,month: 10,day: 14))
let sunday: Date? = calendar.date(from: DateComponents(year: 2020,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
}
我有一个Date扩展名来获取.weekday,如下所示:
extension Date {
var weekday: Int { return Calendar.current.component(.weekday,from: self) }
}
所以问题是我没有使用iso8601日历,该日历从星期一的一周开始。我将其更改为日历,现在可以使用了。
解决方法
正如我在评论中已经提到的那样,问题是您使用的日历ISO8601。该日历的第一个工作日是星期一,而当前日历(可能是公历)的第一个工作日是星期日。
,在模拟器和真实设备之间也许存在差异。 由于它具有不同的语言环境timeZone,请确保它们相同。