Вычесть 7 дней из текущей даты

Кажется, что я не могу вычесть 7 дней от текущей даты. Вот как я это делаю:--2-->

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 получает то же значение, что и текущая дата.

пожалуйста, помогите.

EDIT:в моем коде я забыл заменить переменную, которая получает текущую дату, на правильную. Таким образом, выше код является функциональным.

9 ответов


используйте метод 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

надеюсь, что это помогает


код:

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];

выход:

currentDate: 2012-04-22 12:53:45 +0000
seven days ago: 2012-04-15 12:53:45 +0000

и я полностью согласен с JeremyP.

BR.
Евгений!--6-->


Если вы используете хотя бы 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())

Swift 3

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

надеюсь, что это поможет и thx для dymv


Swift 4.2 iOS 11.x Babec это!--5--> решение, чистый 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 3.0 + версия оригинального принятого ответа

Date().addingTimeInterval(-7 * 24 * 60 * 60)

однако это использует только абсолютные значения. Использование ответов календаря, вероятно, более подходит в большинстве случаев.


ДЛЯ SWIFT 3.0

здесь fucntion, вы можете уменьшить дни, месяц, день любым отсчетом как, например, здесь, я уменьшил год текущей системной даты на 100 лет , вы можете сделать это за день, месяц также просто установите счетчик и сохраните его в массиве, вы можете этот массив в любом месте func currentTime ()

 {

    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)
        }

Swift 3:

модификация ответа Дова.

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)")