Sottrai 7 giorni dalla data corrente


119

Sembra che non sia possibile sottrarre 7 giorni dalla data corrente. Ecco come lo sto facendo:

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 ottiene lo stesso valore della data corrente.

Per favore aiuto.

EDIT: Nel mio codice ho dimenticato di sostituire la variabile che ottiene la data corrente con quella giusta. Quindi il codice sopra è funzionale.


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- Anche se non gestisce le modifiche all'ora legale.
Hot Licks

Dovrebbe funzionare. Funziona se aggiungi 1 invece di sottrarre 7? Come determini che sevenDaysAgo si riferisce a oggi?
JeremyP

Risposte:


112

usa il metodo dateByAddingTimeInterval:

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

produzione:

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

Spero che sia d'aiuto


45
Ci sono casi limite in cui questo non funziona correttamente, ad esempio se l'ora legale cambia durante i sette giorni in questione.
JeremyP

1
La risposta di dymv è il modo più sicuro per farlo.
w3bshark

2
Questa è la risposta sbagliata per i suddetti motivi, usa la risposta di Dymv
BarrettJ

1
In realtà questo può essere fatto semplicemente:[now dateByAddingDays:-7]
CrashOverride

Fare questo tipo di calcolo è pericoloso, preferisci la versione di @ Dov.
ctietze

196

codice:

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

produzione:

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

E sono pienamente d'accordo con JeremyP.

BR.
Eugene


2
Tuttavia, c'è una perdita di memoria in questa risposta.
atuljangra

133

Se utilizzi almeno iOS 8 o OS X 10.9, c'è un modo ancora più pulito:

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

Oppure, con Swift 2:

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

E con Swift 3 e versioni successive diventa ancora più compatto:

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

3
Questa dovrebbe essere la risposta accettata in quanto gestisce tutti i casi limite per te.
Zhivko Bogdanov

@ZhivkoBogdanov La mia risposta è arrivata alcuni anni dopo la risposta accettata, e non credo che tu possa cambiare la tua risposta accettata dopo il fatto.
Dov

È più per riferimento futuro che per qualsiasi altra cosa.
Zhivko Bogdanov

56

Swift 3

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

3
Non utilizzare NSCalendar, usa invece Calendar :)
Jonas

8

Swift 4.2 - Mutate (Update) Self

Ecco un altro modo in cui il poster originale può ottenere una settimana fa se ha già una variabile di data (si aggiorna / si muta).

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

uso

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

o

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

4

La risposta di dymv funziona alla grande. Puoi usarlo in modo rapido

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

Puoi chiamarlo con

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

Spero che aiuti e grazie a Dymv


4

Swift 4.2 iOS 11.x La soluzione di Babec , Swift puro

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

4

Estensione rapida dell'operatore:

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

uso

let today = Date()
let yesterday = today - 7

3

Versione Swift 3.0+ della risposta originale accettata

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

Tuttavia, questo utilizza solo valori assoluti. Utilizzare le risposte del calendario è probabilmente più adatto nella maggior parte dei casi.


-2

Swift 3:

Una modifica alla risposta di Dov.

extension Date {

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

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

Uso:

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

1
Perché è numberOfDaysopzionale e quindi scartato forzatamente? Non dovrebbe essere solo un non opzionale Int?
Dov

È il modo corretto di contenere il valore opzionale nella funzione swift.
AG

1
Ma perché numberOfDays è opzionale? c'è un momento in cui qualcuno chiamerà questo metodo di estensione e non darà un numero di giorni per aggiungere o rimuovere?
Dov

-3

PER SWIFT 3.0

ecco la funzione, puoi ridurre giorni, mese, giorno di qualsiasi conteggio come ad esempio qui, ho ridotto l'anno della data di sistema corrente di 100 anni, puoi farlo per giorno, mese anche solo impostare il contatore e memorizzarlo in un array, puoi questo array ovunque, quindi 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)
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.