【问题标题】:calendar.date(bySetting: .day, value: 1, of: Date()) wrongly always adding one monthcalendar.date(bySetting: .day, value: 1, of: Date()) 错误地总是加一个月
【发布时间】:2019-09-08 22:08:28
【问题描述】:

我想获得两个日期,即当月的第一天和最后一天。很简单。但是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 做到这一点,但如果这是一个错误,我想向苹果提交一个错误。

Edit1:我不是在问如何获取当月的第一天和最后一天。我知道如何使用其他方法来做到这一点,但我如何提前解释,我认为date(byAdding: Calendar.Component, value: Int, to: Date) 方法中存在错误,或者我没有正确使用它。

【问题讨论】:

  • 这是一个已知的错误,.date(bySetting:value:of:) 会及时向前搜索。可以使用.nextDate(after:matching:value:options:),及时搜索.backwards
  • @ItaiFerber 如果这是一个已知的错误,你知道是否有一个错误报告给苹果讨论这个问题?
  • @MwcsMac 我如何在“Obs:”中描述我现在可以用其他方式做到这一点,但我发现这种方法有一个错误,我不是问如何获得第一天和最后一天一个月,我可以通过其他方式做到这一点。
  • 这不是真正的错误,而是方法的工作原理。
  • 我明白为什么会发生这种情况以及为什么它不是一个真正的错误,但对我来说,这是方法或其文档/描述的问题。他们并没有明确表示这是向前搜索,并且在doc 上他们使用了一个例子来告诉>这可能是向前或向后移动,而不一定是最近的[...]

标签: swift calendar


【解决方案1】:

好吧,既然我知道了这个问题,它不一定是方法上的真正错误,而是他们设置组件的方式,搜索第一个转发,而不是真正的设置,在我看来,方法名称、描述和文档并不能反映该方法的真实特征:

他们举了一个例子:

因此,对于“设置为星期四”的示例,查找给定日期所在周中的星期四(可能是向前或向后移动,不一定是最近的星期四)。

但他们建议使用其他方法来更好地控制行为:

要更好地控制确切的行为,请使用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)!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-27
    • 2022-10-18
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多