我想订两个日期,本月的第一天和最后一天。很简单。但是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
值,day值被设置为1,但将1添加到month值。如果我忘了什么,请告诉我,但对我来说,它看起来像只虫子
Obs:我现在可以使用
DateComponent
来实现这一点,但如果是一个bug,我想向苹果提交一个bug。伊迪丝1:我不是在问如何得到本月的第一天和最后一天。我知道如何使用其他方法来实现这一点,但我前面是如何解释的,我认为
date(byAdding: Calendar.Component, value: Int, to: Date)
方法中存在一个bug,或者我没有正确地使用它。 最佳答案
好吧,既然我发现了这个问题,它不一定是方法上的一个真正的错误,但这是他们设置组件的方式,搜索第一个转发,而不是真正的设置,根据我的看法,方法名称、描述和文档并不能反映方法的真正特征:
他们举了一个例子:
所以对于“设置为星期四”的例子,找到给定日期所在周的星期四(可以是向前或向后移动,不一定是最近的星期四)。
但他们建议使用其他方法来获得对行为的更多控制:
要对精确行为进行更多控制,请使用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)!