模拟器和实际设备从日期返回不同的weekOfYear

问题描述

我有一个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,请确保它们相同。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...