calendar.date(bySetting:.day,value:1,of:Date())错误地总是添加一个月

时间:2019-04-18 14:32:06

标签: swift calendar

我想得到两个日期,即本月的第一天和最后一天。很简单但是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)方法中存在错误,或者如果我没有正确使用该错误。

1 个答案:

答案 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)!