web-dev-qa-db-fra.com

Soustraire 7 jours de la date actuelle

Il semble que je ne puisse pas soustraire 7 jours de la date actuelle. Voici comment je le fais:

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 obtient la même valeur que la date actuelle.

S'il vous plaît aider.

EDIT: Dans mon code, j'ai oublié de remplacer la variable qui obtient la date actuelle par la bonne. Donc, le code ci-dessus est fonctionnel.

104
Alex Tau

utilisez la méthode dateByAddingTimeInterval:

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

sortie:

7 days ago: 2012-04-11 11:35:38 +0000

J'espère que ça aide

108
Novarg

code:

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

sortie:

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

Et je suis entièrement d'accord avec JeremyP.

BR.
Eugene

185
dymv

Si vous utilisez au moins iOS 8 ou OS X 10.9, il existe une méthode encore plus simple:

NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                value:-7
                                                               toDate:[NSDate date]
                                                              options:0];

Ou, avec Swift 2:

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

Et avec Swift 3 et plus, il devient encore plus compact:

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

Swift 3

Calendar.current.date(byAdding: .day, value: -7, to: Date())
38
Marckaraujo

la réponse de Dymv fonctionne très bien. Ce que vous pouvez utiliser dans 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))!
    }
}

Vous pouvez appeler cela avec

NSDate.changeDaysBy(-7) // Date week earlier
NSDate.changeDaysBy(14) // Date in next two weeks

J'espère que ça aide et merci à Dymv

4
Babac

Swift 4.2 - Mutate (Update) Self

Voici une autre façon dont l'affiche originale peut obtenir il y a une semaine s'il a déjà une variable de date (se met à jour/se modifie).

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

Usage

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

ou

// Iterate through one week
for i in 1...7 {
    myDate.changeDays(by: i)
    // Do something
}
4
Mark Moeykens

Swift 4.2 iOS 11.x Babec solution, pure 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)!
  }
}
3
user3069232

Swift 3.0 + version de la réponse acceptée d'origine

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

Cependant, cela utilise uniquement des valeurs absolues. Utiliser les réponses du calendrier est probablement plus approprié dans la plupart des cas.

0
originalmyth