想要获取上个月的 NSDateComponents 问题

Posted

技术标签:

【中文标题】想要获取上个月的 NSDateComponents 问题【英文标题】:NSDateComponents issue when want to get previous month 【发布时间】:2016-01-18 06:03:35 【问题描述】:

我有代码:

let components = NSDateComponents()
components.month -= 1
let dateInTheMiddleOfPeriod = NSCalendar.currentCalendar().dateByAddingComponents(components, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))!

但 dateInTheMiddleOfPeriod 是 2015-11-18 06:00:12 +0000 ,但我预计 2015-12-18 06:00:12 +0000 ,因为我需要上个月的日期。为什么会这样?

【问题讨论】:

每个未设置的组件都被视为NSDateComponentUndefined,这是一个非常大的数字。减去一个不是你想要的。 【参考方案1】:

您可以使用 Calendar 组件方法获取今天的 Date 年月组件,通过第零天并获取结果日期的月份:


extension Calendar 
    static let iso8601 = Calendar(identifier: .iso8601)


extension Date 
    var year: Int 
        Calendar.iso8601.component(.year, from: self)
    
    var month: Int 
        Calendar.iso8601.component(.month, from: self)
    
    var lastDateOfPreviousMonth: Date? 
        DateComponents(calendar: .iso8601, year: year, month: month, day: 0).date
    
    var previousMonth: Int 
        lastDateOfPreviousMonth?.month ?? 0
    


Date().lastDateOfPreviousMonth  // "28 Feb 2022 00:00"
Date().previousMonth            // 2

【讨论】:

我将代码替换为 calendarUnitToCalculate = NSCalendarUnit.Month; dateInTheMiddleOfPeriod = NSCalendar.currentCalendar().dateByAddingUnit(calendarUnitToCalculate, value: -1, toDate: dateNow, options: []) 。现在可以了,谢谢【参考方案2】:

在您可以按照步骤操作之前获得一个月的日期,

    创建当前日期的组件, 然后减一个月, 最后再次将组件转换为日期。

示例代码:

let components = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: NSDate())
components.month -= 1
let dateInTheMiddleOfPeriod = NSCalendar.currentCalendar().dateFromComponents(components)!
print(dateInTheMiddleOfPeriod)

【讨论】:

您的解决方案有效,但我更喜欢 Leo Dabus 的解决方案。但无论如何 +1

以上是关于想要获取上个月的 NSDateComponents 问题的主要内容,如果未能解决你的问题,请参考以下文章

在 NSDateComponents 中获取 NSCalendarUnits 的数量

获取本周的第一天和最后一天

NSDateComponents

NSDateComponents 不返回日期

NSDateComponents weekOfYear 返回错误的日期

iOS 获取当前时间