7 Tage vom aktuellen Datum abziehen


116

Es scheint, dass ich 7 Tage nicht vom aktuellen Datum abziehen kann. So mache ich es:

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 erhält den gleichen Wert wie das aktuelle Datum.

Bitte helfen Sie.

EDIT: In meinem Code habe ich vergessen, die Variable, die das aktuelle Datum erhält, durch die richtige zu ersetzen. Der obige Code ist also funktionsfähig.


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- Obwohl es keine Sommerzeitänderungen behandelt.
Hot Licks

Das sollte funktionieren. Funktioniert es, wenn Sie 1 addieren, anstatt 7 zu subtrahieren? Wie stellen Sie fest, dass sich SevenDaysAgo auf heute bezieht?
JeremyP

Antworten:


112

Verwenden Sie die dateByAddingTimeInterval-Methode:

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

Ausgabe:

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

Ich hoffe es hilft


45
Es gibt Randfälle, in denen dies nicht richtig funktioniert, z. B. wenn sich die Sommerzeit während der betreffenden sieben Tage ändert.
JeremyP

1
Die Antwort von dymv ist der sicherere Weg, dies zu tun.
w3bshark

2
Dies ist die falsche Antwort aus den oben genannten Gründen. Verwenden Sie die Antwort von
dymv

1
Eigentlich kann dies einfach gemacht werden durch:[now dateByAddingDays:-7]
CrashOverride

Diese Art der Berechnung ist gefährlich, bevorzugen Sie die Version von @ Dov.
Ctietze

196

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

Ausgabe:

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

Und ich stimme JeremyP voll und ganz zu.

BR.
Eugene


2
Diese Antwort enthält jedoch einen Speicherverlust.
Atuljangra

132

Wenn Sie mindestens iOS 8 oder OS X 10.9 verwenden, gibt es einen noch saubereren Weg:

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

Oder mit Swift 2:

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

Und mit Swift 3 und höher wird es noch kompakter:

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

3
Dies sollte die akzeptierte Antwort sein, da alle Randfälle für Sie behandelt werden.
Schiwko Bogdanow

@ZhivkoBogdanov Meine Antwort kam einige Jahre nach der akzeptierten Antwort, und ich glaube nicht, dass Sie Ihre akzeptierte Antwort nachträglich ändern können.
Dov

Es ist mehr als zukünftige Referenz.
Zhivko Bogdanov

56

Swift 3

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

3
Verwenden Sie nicht NSCalendar, sondern Calendar :)
Jonas

8

Swift 4.2 - Selbst mutieren (aktualisieren)

Hier ist eine andere Möglichkeit, wie das Originalposter vor einer Woche abgerufen werden kann, wenn er bereits eine Datumsvariable hat (aktualisiert / mutiert sich selbst).

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

Verwendung

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

oder

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

4

Die Antwort von dymv funktioniert großartig. Dies können Sie schnell verwenden

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

Sie können dies mit aufrufen

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

Hoffe es hilft und danke an dymv


4

Swift 4.2 iOS 11.x Babecs Lösung, reine 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)!
  }
}

4

Schnelle Operatorerweiterung:

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

Verwendung

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

3

Swift 3.0+ Version der ursprünglich akzeptierten Antwort

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

Dies verwendet jedoch nur absolute Werte. Die Verwendung von Kalenderantworten ist in den meisten Fällen wahrscheinlich besser geeignet.


-2

Swift 3:

Eine Modifikation von Dovs Antwort.

extension Date {

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

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

Verwendung:

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

1
Warum ist numberOfDaysoptional und dann gewaltsam ausgepackt? Sollte es nicht einfach nicht optional sein Int?
Dov

Dies ist die richtige Methode, um optionale Werte in der Swift-Funktion zu enthalten.
AG

1
Aber warum ist numberOfDays optional? Gibt es eine Zeit, in der jemand diese Erweiterungsmethode aufruft und nicht die Anzahl der Tage zum Hinzufügen oder Entfernen angibt?
Dov

-3

FÜR SWIFT 3.0

Hier ist die Funktion, Sie können Tage, Monat, Tag um eine beliebige Anzahl reduzieren, wie zum Beispiel hier. Ich habe das Jahr des aktuellen Systemdatums um 100 Jahre reduziert. Sie können dies für Tag und Monat tun. Stellen Sie auch einfach den Zähler ein und speichern Sie es in einem Array, können Sie dieses Array überall dann 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)
        }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.