Wie füge ich einem NSDate 1 Tag hinzu?

320

Grundsätzlich, wie der Titel sagt. Ich frage mich, wie ich einen Tag zu einem hinzufügen könnte NSDate.

Also wenn es wäre:

21st February 2011

Es würde werden:

22nd February 2011

Oder wenn es wäre:

31st December 2011

Es würde werden:

1st January 2012.
Andrew
quelle
4
Beachten Sie, dass ein NSDate kein Datum darstellt, sondern einen Zeitpunkt. Es enthält also sowohl eine Uhrzeit als auch ein Datum.
Rog
4
Einverstanden - Sie sollten die Antwort von Zack German unten verwenden. Siehe Apples Programmierhandbuch für Datum und Uhrzeit .
Ash Furrow
Scrollen Sie nach unten für neuere (und kürzere) Lösungen!
Catanore

Antworten:

711

Swift 5.0:

var dayComponent    = DateComponents()
dayComponent.day    = 1 // For removing one day (yesterday): -1
let theCalendar     = Calendar.current
let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
print("nextDate : \(nextDate)")

Ziel c :

NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0];

NSLog(@"nextDate: %@ ...", nextDate);

Dies sollte selbsterklärend sein.

Zaky Deutsch
quelle
19
Sie können auch negative Komponenten verwenden, um von einem Datum zu subtrahieren.
DataGraham
58
Viel bessere Lösung als die ausgewählte Antwort
Justin Meiners
19
+1 für die Verwendung von Datumskomponenten anstelle des Hinzufügens von Sekunden im Wert von einem Tag.
Abizern
Ja, funktioniert gut für die Sommerzeit. Tipp für die Sommerzeitprüfung: Setzen Sie Datum und Uhrzeit auf Ihrem Mac zurück und starten Sie den Simulator neu. Anschließend folgt er Ihrer Systemzeit.
Rob van den Berg
2
In Swift müssen Sie den letzten Parameter des dateByAddingComponents Aufrufs aufNSCalendarOptions(rawValue: 0)
gfpacheco
270

Seit iOS 8 können Sie verwenden NSCalendar.dateByAddingUnit

Beispiel in Swift 1.x:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
         .CalendarUnitDay, 
         value: 1, 
         toDate: today, 
         options: NSCalendarOptions(0)
    )

Swift 2.0:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
        .Day, 
        value: 1, 
        toDate: today, 
        options: []
    )

Swift 3.0:

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)
Ben Sinclair
quelle
5
Ist es nur ich oder wäre es für Swift nicht viel einfacher, etwas eingebaut zu haben date.add(.days, 1)? * geht und baut eine Erweiterung
quemeful
2
@quemeful extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }NutzungDate().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
Leo Dabus
82

Aktualisiert für Swift 5

let today = Date()
let nextDate = Calendar.current.date(byAdding: .day, value: 1, to: today)

Ziel c

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 // now build a NSDate object for the next day
 NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
 [offsetComponents setDay:1];
 NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0];
iHS
quelle
34

iOS 8+, OSX 10.9+, Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];
vikingosegundo
quelle
Beachten Sie, dass Sie das Gerät hier nicht maskieren können (verwenden Sie nur eines).
Catanore
31

Eine funktionierende Swift 3+ -Implementierung basierend auf der Antwort von highmaintenance und dem Kommentar von vikingosegundo . Diese Datumserweiterung bietet außerdem zusätzliche Optionen zum Ändern von Jahr, Monat und Uhrzeit:

extension Date {

    /// Returns a Date with the specified amount of components added to the one it is called with
    func add(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        let components = DateComponents(year: years, month: months, day: days, hour: hours, minute: minutes, second: seconds)
        return Calendar.current.date(byAdding: components, to: self)
    }

    /// Returns a Date with the specified amount of components subtracted from the one it is called with
    func subtract(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        return add(years: -years, months: -months, days: -days, hours: -hours, minutes: -minutes, seconds: -seconds)
    }

}

Die Verwendung für das Hinzufügen eines Tages, wie vom OP gefordert, wäre dann:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)
Benno Kress
quelle
2
Sie können den Code mithilfe von Datumskomponenten massiv kürzen.
Vikingosegundo
Sie haben Recht, obwohl es meiner Meinung nach Nachteile hat: - Der Code mit der Erweiterung sieht nicht so sauber aus - er eröffnet einige unnötige Optionen mit Komponenten, die wenig Sinn machen, als würde let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] ich meiner Antwort die alternative Lösung hinzufügen . Vielen Dank für Ihren Vorschlag, @vikingosegundo!
Benno Kress
3
Nun
vikingosegundo
Oh, das ist eigentlich besser, danke!
Benno Kress
22

Swift 4.0 (genau wie Swift 3.0 in dieser wunderbaren Antwort , die es nur Neulingen wie mir klar macht)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)
Joshua Dance
quelle
3
Haben Sie vergessen, Ihren Variablennamen zu ändern?
Rakesha Shastri
13

Verwenden Sie die folgende Funktion und verwenden Sie den Days-Parameter, um das Datum daysAhead / daysBehind zu erhalten. Übergeben Sie den Parameter einfach als positiv für das zukünftige Datum oder negativ für frühere Daten:

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days
{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.day = days;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
                                                     toDate:fromDate
                                                    options:0];
    [dateComponents release];
    return previousDate;
}
Bhupendra
quelle
10

In kurzer Zeit

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)
Steve Ng
quelle
8

Es ist Arbeit!

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitDay;
    NSInteger value = 1;
    NSDate *today = [NSDate date];
    NSDate *tomorrow = [calendar dateByAddingUnit:unit value:value toDate:today options:NSCalendarMatchStrictly];
DenZhukov
quelle
Nun, anscheinend ist diese Frage Code Dump Himmel. Also kein Grund, dich herauszusuchen.
Drew
2
Meine Antwort ist korrekter, denn wenn Sie die Option NSCalendarWrapComponents (0) verwenden, können Sie ein Datum nur im Bereich des aktuellen Monats erstellen. Wenn Sie dem 31. Januar 2016 einen Tag mit NSCalendarWrapComponents hinzufügen, erhalten Sie den 1. Januar 2016. Mit der Option NSCalendarMatchStrictly erhalten Sie das nächste Kalenderdatum.
DenZhukov
8

Swift 3.0 sehr einfache Implementierung wäre:

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}
AmJa
quelle
5
NSDate *today=[NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components=[[NSDateComponents alloc] init];
components.day=1;
NSDate *targetDate =[calendar dateByAddingComponents:components toDate:today options: 0];
Rahul Gupta
quelle
5

Swift 4.0

extension Date {
    func add(_ unit: Calendar.Component, value: Int) -> Date? {
        return Calendar.current.date(byAdding: unit, value: value, to: self)
    }
}

Verwendungszweck

date.add(.day, 3)!   // adds 3 days
date.add(.day, -14)!   // subtracts 14 days

Hinweis: Wenn Sie nicht wissen, warum die Codezeilen mit einem Ausrufezeichen enden, suchen Sie bei Google nach "Swift Optionals".

sehr schön
quelle
3

Sie können die Methode von NSDate verwenden, - (id)dateByAddingTimeInterval:(NSTimeInterval)secondswo secondsdies der Fall wäre60 * 60 * 24 = 86400

Tiago
quelle
3
Das addByTimeInterval von NSDate war in iOS 4 ( bit.ly/vtOzvU ) veraltet . Verwenden Sie stattdessen dateByAddingTimeInterval ( bit.ly/vRkFrN ).
Billmaya
4
Tage können aufgrund der Sommerzeit 23, 24 oder 25 Stunden haben.
Vikingosegundo
3

In Swift 2.1.1 und xcode 7.1 OSX 10.10.5 können Sie mithilfe der Funktion eine beliebige Anzahl von Tagen vorwärts und rückwärts hinzufügen

func addDaystoGivenDate(baseDate:NSDate,NumberOfDaysToAdd:Int)->NSDate
{
    let dateComponents = NSDateComponents()
    let CurrentCalendar = NSCalendar.currentCalendar()
    let CalendarOption = NSCalendarOptions()

    dateComponents.day = NumberOfDaysToAdd

    let newDate = CurrentCalendar.dateByAddingComponents(dateComponents, toDate: baseDate, options: CalendarOption)
    return newDate!
}

Funktionsaufruf zur Erhöhung des aktuellen Datums um 9 Tage

var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9)
print(newDate)

Funktionsaufruf zur Dekrementierung des aktuellen Datums um 80 Tage

newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
 print(newDate)
Dharmesh
quelle
3

Hier ist eine Allzweckmethode, mit der Sie jede Art von Einheit (Jahr / Monat / Tag / Stunde / Sekunde usw.) zum angegebenen Datum addieren / subtrahieren können.

Verwenden von Swift 2.2

func addUnitToDate(unitType: NSCalendarUnit, number: Int, date:NSDate) -> NSDate {

    return NSCalendar.currentCalendar().dateByAddingUnit(
        unitType,
        value: number,
        toDate: date,
        options: NSCalendarOptions(rawValue: 0))!

}

print( addUnitToDate(.Day, number: 1, date: NSDate()) ) // Adds 1 Day To Current Date
print( addUnitToDate(.Hour, number: 1, date: NSDate()) ) // Adds 1 Hour To Current Date
print( addUnitToDate(.Minute, number: 1, date: NSDate()) ) // Adds 1 Minute To Current Date

// NOTE: You can use negative values to get backward values too
n.by.n
quelle
3
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];

Ok - ich dachte, das würde für mich funktionieren. Wenn Sie damit jedoch einen Tag zum 31. März 2013 hinzufügen, wird ein Datum zurückgegeben, zu dem nur 23 Stunden hinzugefügt wurden. Es kann durchaus die 24 haben, aber bei der Verwendung in Berechnungen wurden nur 23:00 Stunden hinzugefügt.

Wenn Sie auf den 28. Oktober 2013 vorwärts springen, fügt der Code 25 Stunden hinzu, was zu einer Datums- und Uhrzeitzeit von 2013-10-28 01:00:00 führt.

Um einen Tag hinzuzufügen, habe ich das Ding oben gemacht und Folgendes hinzugefügt:

NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

Kompliziert, hauptsächlich aufgrund der Sommerzeit.

Carl Hine
quelle
einmal im Jahr hat ein Tag nur 23 Stunden. einmal 25. und alle paar Jahre hat es die Länge von 60*60*24 + 1wegen Schaltsekunden. Datteln müssen all dies abdecken, und deshalb ist der Umgang mit Kakao bei Datteln wirklich großartig!
Vikingosegundo
2
NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *tomorrowDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE, dd MMM yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:tomorrowDate]);
Shrikant Tanwade
quelle
2

In Swift können Sie eine Erweiterung vornehmen, um eine Methode in NSDate hinzuzufügen

extension NSDate {
    func addNoOfDays(noOfDays:Int) -> NSDate! {
        let cal:NSCalendar = NSCalendar.currentCalendar()
        cal.timeZone = NSTimeZone(abbreviation: "UTC")!
        let comps:NSDateComponents = NSDateComponents()
        comps.day = noOfDays
        return cal.dateByAddingComponents(comps, toDate: self, options: nil)
    }
}

Sie können dies als verwenden

NSDate().addNoOfDays(3)
Muhammad Aamir Ali
quelle
2

Update für Swift 4:

let now = Date() // the current date/time
let oneDayFromNow = Calendar.current.date(byAdding: .day, value: 1, to: now) // Tomorrow with same time of day as now
Ryan
quelle
1

für schnelle 2.2:

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit(
        .Day,
        value: 1,
        toDate: today,
        options: NSCalendarOptions.MatchStrictly)

Hoffe das hilft jemandem!

Paul Lehn
quelle
1

Swift 4, wenn Sie wirklich nur eine 24-Stunden-Schicht (60 * 60 * 24 Sekunden) und nicht "1 Kalendertag" benötigen.

Zukunft: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

Vergangenheit: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))

John Robi
quelle
1

Update für Swift 5

let nextDate = fromDate.addingTimeInterval(60*60*24)
Manish
quelle
0
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
NSDate *startDate = [calendar dateFromComponents:components];
NSLog(@"StartDate = %@", startDate);

components.day += 1;
NSDate *endDate = [calendar dateFromComponents:components];
NSLog(@"EndDate = %@", endDate);
Vũ Ngọc Giang
quelle
0

Ich hatte das gleiche Problem; Verwenden Sie eine Erweiterung für NSDate:

- (id)dateByAddingYears:(NSUInteger)years
                 months:(NSUInteger)months
                   days:(NSUInteger)days
                  hours:(NSUInteger)hours
                minutes:(NSUInteger)minutes
                seconds:(NSUInteger)seconds
{
    NSDateComponents * delta = [[[NSDateComponents alloc] init] autorelease];
    NSCalendar * gregorian = [[[NSCalendar alloc]
                               initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];

    [delta setYear:years];
    [delta setMonth:months];
    [delta setDay:days];
    [delta setHour:hours];
    [delta setMinute:minutes];
    [delta setSecond:seconds];

    return [gregorian dateByAddingComponents:delta toDate:self options:0];
}
Slashlos
quelle
0

Swift 2.0

let today = NSDate()    
let calendar = NSCalendar.currentCalendar()
let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)
Sébastien REMY
quelle
0

In Swift 4 oder Swift 5 können Sie wie folgt verwenden:

    let date = Date()
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: date)
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let yesterday_date = dateFormatter.string(from: yesterday!)
    print("yesterday->",yesterday_date)

Ausgabe:

Current date: 2020-03-02
yesterday date: 2020-03-01
Enamul Haque
quelle
0

String-Erweiterung: String_Date> Datum konvertieren

extension String{
  func DateConvert(oldFormat:String)->Date{ // format example: yyyy-MM-dd HH:mm:ss 
    let isoDate = self
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = oldFormat
    return dateFormatter.date(from:isoDate)!
  }
}

Datumserweiterung: Datum konvertieren > Zeichenfolge

extension Date{
 func DateConvert(_ newFormat:String)-> String{
    let formatter = DateFormatter()
    formatter.dateFormat = newFormat
    return formatter.string(from: self)
 }
}

Datumserweiterung: Get +/- Date

extension String{
  func next(day:Int)->Date{
    var dayComponent    = DateComponents()
    dayComponent.day    = day
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
  }

 func past(day:Int)->Date{
    var pastCount = day
    if(pastCount>0){
        pastCount = day * -1
    }
    var dayComponent    = DateComponents()
    dayComponent.day    = pastCount
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
 }
}

Verwendungszweck:

let today = Date()
let todayString = "2020-02-02 23:00:00"
let newDate = today.DateConvert("yyyy-MM-dd HH:mm:ss") //2020-02-02 23:00:00
let newToday = todayString.DateConvert(oldFormat: "yyyy-MM-dd HH:mm:ss")//2020-02-02
let newDatePlus = today.next(day: 1)//2020-02-03 23:00:00
let newDateMinus = today.past(day: 1)//2020-02-01 23:00:00

Referenz: aus mehreren Fragen
Wie füge ich einem NSDate 1 Tag hinzu?
mathematische Funktion, um positive int in negative und negative in positive umzuwandeln?
Konvertieren von NSString in NSDate (und wieder zurück)

Muhammad Asyraf
quelle
-1

Verwenden Sie folgenden Code:

NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

Wie

addTimeInterval

ist jetzt veraltet.

Hemang
quelle
3
Tage können 23, 24 oder 25 Stunden haben, wegen der Sommerzeit
vikingosegundo