Objective c 从当前日期减去7天

Objective c 从当前日期减去7天,objective-c,ios,nsdate,Objective C,Ios,Nsdate,似乎我不能从当前日期减去7天。我就是这样做的: NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; [offsetComponents setDay:-7]; NSDate *sevenDaysAgo = [gregorian

似乎我不能从当前日期减去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];
SevenDaysAgo获取与当前日期相同的值

请帮忙


编辑:在我的代码中,我忘记用正确的变量替换获取当前日期的变量。因此上述代码是有效的。

使用dateByAddingTimeInterval方法:

NSDate *now = [NSDate date];
NSDate *sevenDaysAgo = [now dateByAddingTimeInterval:-7*24*60*60];
NSLog(@"7 days ago: %@", sevenDaysAgo);
输出:

7 days ago: 2012-04-11 11:35:38 +0000
希望有帮助

代码:

输出:

我完全同意杰里米普的观点

BR.

Eugene

如果您至少运行iOS 8或OS X 10.9,还有一种更干净的方法:

NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                value:-7
                                                               toDate:[NSDate date]
                                                              options:0];
或者,使用Swift 2:

let sevenDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -7,
    toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
借助Swift 3及更高版本,它变得更加紧凑:

let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())

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))!
    }
}
你可以把这个叫做

NSDate.changeDaysBy(-7) // Date week earlier
NSDate.changeDaysBy(14) // Date in next two weeks
希望对dymv和thx有所帮助 适用于SWIFT 3.0

这是功能,你可以减少天,月,日的任何计数 比如这里,我把当前系统日期的年份减少了100年,你也可以把它改为天,月 把柜台摆好 并将其存储在一个数组中,您可以在任何地方使用该数组 func currentTime()

Swift 3:

对Dov答案的修改

extension Date {

    func dateBeforeOrAfterFromToday(numberOfDays :Int?) -> Date {

        let resultDate = Calendar.current.date(byAdding: .day, value: numberOfDays!, to: Date())!
        return resultDate
    }
}
用法:

let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")

原始接受答案的Swift 3.0+版本

日期()。添加时间间隔(-7*24*60*60)


但是,这仅使用绝对值。在大多数情况下,使用日历答案可能更合适。

Swift 4.2iOS 11.x解决方案,纯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)!
  }
}
Swift 4.2-自我变异(更新) 如果原始海报已经有了日期变量(更新/变异本身),那么一周前可以获得另一种方式

用法 或 Swift操作员分机:
延期日期{
静态函数-(左:日期,右:整数)->日期{
返回Calendar.current.date(通过添加:.day,值:-rhs,to:lhs)!
}
}
用法
let today=Date()
让昨天=今天-7

[NSDate date WITH TIMEINTERVALICENCERFERENCEDATE:[NSDate date]。TIMEINTERVALICENCERFERENCEDATE-(7*24*60*60)]
--尽管它不处理DST更改。这应该可以工作。如果你加1而不是减7行吗?您如何确定sevenDaysAgo指的是今天?有些情况下,这无法正常工作,例如,如果夏令时在所讨论的七天内发生变化。dymv的答案是这样做的更安全的方法。出于上述原因,这是错误的答案,请使用dymv的答案。实际上,这可以通过:
[现在dateByAddingDays:-7]
进行这种计算是危险的,更喜欢@Dov的版本。但这个答案中存在内存泄漏。不要使用NSCalendar,而是使用Calendar:)这应该是公认的答案,因为它可以为您处理所有边缘情况。@ZhivkoBogdanov我的答案是在公认的答案之后几年的,我不相信您可以更改ac事后接受答案。这比其他任何东西都更便于将来参考。为什么
numberOfDays
是可选的,然后强制展开?它不应该只是一个非可选的
Int
?它是在swift函数中包含可选值的正确方法。但是为什么numberOfDays是可选的?有没有人会调用这个ext是否有一种方法,并且没有给多少天的时间来添加或删除?
 {

    let date = Date()
    let calendar = Calendar.current
    var year = calendar.component(.year, from: date)
    let month = calendar.component(.month, from: date)
    let  day = calendar.component(.day, from: date)
    let pastyear = year - 100
    var someInts = [Int]()
    printLog(msg: "\(day):\(month):\(year)" )

    for _ in pastyear...year        {
        year -= 1
                     print("\(year) ")
        someInts.append(year)
    }
          print(someInts)
        }
extension Date {

    func dateBeforeOrAfterFromToday(numberOfDays :Int?) -> Date {

        let resultDate = Calendar.current.date(byAdding: .day, value: numberOfDays!, to: Date())!
        return resultDate
    }
}
let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")
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)!
  }
}
extension Date {
    mutating func changeDays(by days: Int) {
        self = Calendar.current.date(byAdding: .day, value: days, to: self)!
    }
}
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
// Iterate through one week
for i in 1...7 {
    myDate.changeDays(by: i)
    // Do something
}