我想得到两个日期,即本月的第一天和最后一天。很简单但是date(bySetting: Calendar.Component, value: Int, of: Date)
无法正常工作。
看这段代码:
Date()
打印2019-04-18 14:11:36 UTC
时
let calendar = Calendar.current
let firstDayDate = calendar.date(bySetting: .day, value: 1, to: Date())! //2019-05-01 03:00:00 UTC
let firsDayNextMonth = calendar.date(byAdding: .month, value: 1, to: firstDayDate)! //2019-06-01 03:00:00 UTC
let lastDayMonthDate = calendar.date(bySetting: .day, value: -1, to: firsDayNextMonth)! //2019-05-31 03:00:00 UTC
查看firstDayDate
的值,将日值设置为1,但将1加到月值上。
请告诉我是否遗忘了一些东西,但对我来说,这似乎是个错误
Obs:我现在可以使用DateComponent
来做到这一点,但是如果是bug,我想向Apple提交bug。
Edit1 :我不是在问如何获取本月的第一天和最后一天。我知道如何使用其他方法来做到这一点,但是我如何进一步解释,我认为date(byAdding: Calendar.Component, value: Int, to: Date)
方法中存在错误,或者如果我没有正确使用该错误。
答案 0 :(得分:1)
好吧,既然我知道这个问题,不一定是方法上的真正错误,但是这是他们设置组件,搜索第一个前进的方式,而不是真正设置< / strong>,据我所知,方法名称,说明和文档并未反映该方法的真正功能:
他们使用一个示例:
因此,对于“设置为星期四”的示例,在给定日期所在的周中找到星期四(可以向前或向后移动,不一定是最近的星期四)。
但是他们建议使用其他方法来更好地控制行为:
要进一步控制确切行为,请使用nextDate(after:matching:matchingPolicy:behavior:direction:)。
因此,这是使用此推荐方法的实现:
let componentDay = DateComponents(day: 1)
let calendar = Calendar.current
let firstDayDate = calendar.nextDate(after: Date(), matching: componentDay, matchingPolicy: .previousTimePreservingSmallerComponents, direction: .backward)!
let firsDayNextMonth = calendar.date(byAdding: .month, value: 1, to: firstDayDate)!
let lastDayMonthDate = calendar.date(byAdding: .day, value: -1, to: firsDayNextMonth)!