从当前日期减去7天

Ale*_*Tau 106 objective-c nsdate ios

似乎我不能从当前日期减去7天.这就是我这样做的方式:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:-7];
NSDate *sevenDaysAgo = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];
Run Code Online (Sandbox Code Playgroud)

SevenDaysAgo获得与当前日期相同的价值.

请帮忙.

编辑:在我的代码中,我忘了用正确的日期替换当前日期的变量.所以上面的代码是有用的.

dym*_*ymv 188

码:

NSDate *currentDate = [NSDate date];
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:-7];
NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:currentDate options:0];
NSLog(@"\ncurrentDate: %@\nseven days ago: %@", currentDate, sevenDaysAgo);
[dateComponents release];
Run Code Online (Sandbox Code Playgroud)

输出:

currentDate: 2012-04-22 12:53:45 +0000
seven days ago: 2012-04-15 12:53:45 +0000
Run Code Online (Sandbox Code Playgroud)

而且我完全赞同JeremyP.

BR.
尤金

  • 但是这个答案中有内存泄漏. (2认同)

Dov*_*Dov 121

如果你至少运行iOS 8或OS X 10.9,那么有一种更清晰的方式:

NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                value:-7
                                                               toDate:[NSDate date]
                                                              options:0];
Run Code Online (Sandbox Code Playgroud)

或者,使用Swift 2:

let sevenDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -7,
    toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
Run Code Online (Sandbox Code Playgroud)

使用Swift 3及更高版本,它变得更加紧凑:

let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为它可以为您处理所有极端情况。 (2认同)

Nov*_*arg 110

使用dateByAddingTimeInterval方法:

NSDate *now = [NSDate date];
NSDate *sevenDaysAgo = [now dateByAddingTimeInterval:-7*24*60*60];
NSLog(@"7 days ago: %@", sevenDaysAgo);
Run Code Online (Sandbox Code Playgroud)

输出:

7 days ago: 2012-04-11 11:35:38 +0000
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你

  • 存在无法正常工作的边缘情况,例如,如果在所讨论的七天期间夏令时发生变化. (43认同)
  • 对于上述原因,这是错误的答案,请使用dymv的答案 (2认同)

Mar*_*ujo 41

斯威夫特3

Calendar.current.date(byAdding: .day, value: -7, to: Date())
Run Code Online (Sandbox Code Playgroud)

  • 不要使用 NSCalendar,而是使用 Calendar :) (3认同)

Sam*_*Sam 8

Swift 运算符扩展:

extension Date {
    
    static func -(lhs: Date, rhs: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: -rhs, to: lhs)!
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

let today = Date()
let sevenDayAgo = today - 7
Run Code Online (Sandbox Code Playgroud)


Bab*_*bac 5

dymv 的回答很好。这你可以在 swift 中使用

extension NSDate {    
    static func changeDaysBy(days : Int) -> NSDate {
        let currentDate = NSDate()
        let dateComponents = NSDateComponents()
        dateComponents.day = days
        return NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以用

NSDate.changeDaysBy(-7) // Date week earlier
NSDate.changeDaysBy(14) // Date in next two weeks
Run Code Online (Sandbox Code Playgroud)

希望它对 dymv 有所帮助和感谢


use*_*232 5

Swift 4.2 iOS 11.x Babec 的解决方案,纯 Swift

extension Date {
  static func changeDaysBy(days : Int) -> Date {
    let currentDate = Date()
    var dateComponents = DateComponents()
    dateComponents.day = days
    return Calendar.current.date(byAdding: dateComponents, to: currentDate)!
  }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ens 5

Swift 4.2-变异(更新)自我

如果原始海报的发布者已经具有日期变量(可以自行更新/更改),则可以通过另一种方式获得该信息。

extension Date {
    mutating func changeDays(by days: Int) {
        self = Calendar.current.date(byAdding: .day, value: days, to: self)!
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

var myDate = Date()       // Jan 08, 2019
myDate.changeDays(by: 7)  // Jan 15, 2019
myDate.changeDays(by: 7)  // Jan 22, 2019
myDate.changeDays(by: -1) // Jan 21, 2019
Run Code Online (Sandbox Code Playgroud)

要么

// Iterate through one week
for i in 1...7 {
    myDate.changeDays(by: i)
    // Do something
}
Run Code Online (Sandbox Code Playgroud)