【发布时间】:2021-01-27 05:56:38
【问题描述】:
我有一个 Date 对象,我需要从中获取 weekOfYear,我的代码在真实设备上运行良好,但如果我选择星期日,则在模拟器上提前一周。一周中的所有其他日子都可以正常工作。
我知道模拟器使用的是mac的日期和时间,但是mac和真机都设置为auto,同一个时区,同一个设置。
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 号星期日。
提前感谢您的任何提示。
更新
感谢大家的cmets,他们帮我找到了问题。
我使用的日历是这样的:
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 日历。我将其更改为我的日历,现在可以使用了。
【问题讨论】:
-
我在 Mac 和 iPhone 11 pro 的操场上运行了这段代码,两次都得到了 42 和 43。您是否实现了将
weekOfYear添加到Date的扩展?显示该代码。 -
首先不要打印日期。它将为您提供 UTC 时区日期表示。使用
date.description(with: .current)我周日也得到了 43,这是正确的。除 ISO8601 日历从星期一开始外,所有日历的星期都从星期日开始。你能检查一下你的代码中使用了哪个日历吗?我在这里使用.gregorian。 -
恢复您正在省略代码中最重要的部分。在不知道使用的日历的情况下,我们真的无能为力。
-
“我知道模拟器使用的是mac的日期和时间”。真的没关系。日期将始终是您当前时区的那一天的开始。
-
@CristianMoisei 当你打印一个日期时,它总是会在UTC打印相应的时间。日期没有时区。这只是一个时间点。日期表示(字符串)是显示本地化日期和当前时区的方式。
标签: ios swift date date-conversion nsdatecomponents