【问题标题】:Simulator vs real device return different weekOfYear from Date模拟器与真实设备从日期返回不同的 weekOfYear
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    可能模拟器和真机有区别。 因为它有不同的区域设置时区,请确保它们相同。

    【讨论】:

    • 谢谢马克。问题在于 Leo 建议我在扩展程序中使用了错误的日历,因此它默认为星期从星期日开始的日历。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2018-08-04
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多