我试图弄明白为什么设置日期的weekday属性会将错误的日期设置为Monday。调用以下代码:
print(Date().description(with: .current))
print("--")
print(Calendar.current.date(bySetting: .weekday, value: 2, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 3, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 4, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 5, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 6, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 7, of: Date())?.description(with: .current))
print(Calendar.current.date(bySetting: .weekday, value: 1, of: Date())?.description(with: .current))
打印此内容:
Tuesday, 3 January 2023 at 02:07:35 Eastern European Standard Time
--
Monday, 9 January 2023 at 00:00:00 Eastern European Standard Time
Tuesday, 3 January 2023 at 02:07:35 Eastern European Standard Time
Wednesday, 4 January 2023 at 00:00:00 Eastern European Standard Time
Thursday, 5 January 2023 at 00:00:00 Eastern European Standard Time
Friday, 6 January 2023 at 00:00:00 Eastern European Standard Time
Saturday, 7 January 2023 at 00:00:00 Eastern European Standard Time
Sunday, 8 January 2023 at 00:00:00 Eastern European Standard Time
为什么将工作日设置为2会返回9号星期一(即下周),而不是2号星期一的预期结果?
如果我尝试将weekOfYear属性设置为date,所有其他属性仍然可以正常工作,但是星期一现在是2024年。
1条答案
按热度按时间t5fffqht1#
这是预期的行为,函数将尝试产生一个结果,它位于给定结果的下一个更大的分量中,所以在这种情况下,它不会像你预期的那样给出2,它将返回9。
有关更多说明,请阅读文档here。
更改组件的值通常需要更改更高的组件或耦合组件。例如,将Weekday设置为Thursday通常需要更改Day组件的值,还可能需要更改Month和Year。如果不存在这样的时间,则返回下一个可用时间(例如,它可以在与名义目标日期不同的日、周、月...)将一个组件设置为不一致的内容会迫使其他组件改变;例如,将工作日设置为星期四可能会移动日,也可能会移动月和年。此方法的确切行为是由实现定义的。例如,如果将工作日更改为星期四,是否会向前移动到下一个,向后移动到上一个,还是到最近的星期四?算法将尝试产生一个结果,该结果位于给定组件的下一个较大组件中(在本文档的顶部有一个Map表)。因此,对于“设置为星期四”的示例,查找给定日期所在的星期中的星期四(可以向前或向后移动,不一定是最近的星期四)。要更好地控制确切的行为,请使用nextDate(after:matching:matchingPolicy:behavior:direction:)。