web-dev-qa-db-fra.com

Comment ajouter 1 jour à un NSDate?

Fondamentalement, comme le titre le dit. Je me demande comment je pourrais ajouter 1 jour à un NSDate.

Donc si c'était:

21st February 2011

Il deviendrait:

22nd February 2011

Ou si c'était:

31st December 2011

Il deviendrait:

1st January 2012.
303
Andrew
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);

Cela devrait être explicite.

690
Zaky German

Depuis iOS 8, vous pouvez utiliser NSCalendar.dateByAddingUnit

Exemple dans 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)
253
highmaintenance

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

Mise à jour pour Swift 5

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

iOS 8+, OSX 10.9+, Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];
34
vikingosegundo

Une implémentation de travail Swift 3 & 4 basée sur highmaintenance's answer et vikingosegundo's comment. Cette extension de date a également des options supplémentaires pour changer l’année, le mois et l’heure:

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

}

L'utilisation pour seulement l'ajout d'un jour demandé par OP serait alors:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)
24
Benno Kress

Swift 4.0 (identique à Swift 3.0 à cette réponse merveilleuse , tout est clair pour les débutants comme moi )

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)
22
Joshua Dance

Utilisez la fonction ci-dessous et utilisez le paramètre jour pour obtenir la date jours avant/jours de retard comme paramètre positif pour la date future ou négatif pour les dates précédentes:

+ (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;
}
12
Bhupendra

En rapide

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

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

L'implémentation très simple de Swift 3.0 serait:

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}
8
AmJa

C'est du travail!

    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];
7
DenZhukov
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];
5
Rahul Gupta

Vous pouvez utiliser la méthode de NSDate - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsseconds serait 60 * 60 * 24 = 86400

4
Tiago

Swift 4.

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

tilisation

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

Remarque: Si vous ne savez pas pourquoi les lignes de code se terminent par un point d'exclamation, recherchez "Swift Optionals" sur Google.

4
quemeful

Dans Swift 2.1.1 et xcode 7.1 OSX 10.10.5, vous pouvez ajouter un nombre quelconque de jours en avant et en arrière à l'aide de la fonction

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

appel de fonction pour incrémenter la date actuelle de 9 jours

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

appel de fonction pour décrémenter la date actuelle de 80 jours

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

Voici une méthode d'usage général qui vous permet d'ajouter/soustraire tout type d'unité (Année/Mois/Jour/Heure/Seconde etc.) à la date spécifiée.

Utilisation de 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
3
n.by.n

Dans Swift, vous pouvez créer une extension pour ajouter une méthode dans NSDate

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

vous pouvez l'utiliser comme

NSDate().addNoOfDays(3)
2
Muhammad Aamir Ali
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

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

Ok - je pensais que ça allait marcher pour moi. Cependant, si vous l'utilisez pour ajouter un jour au 31 mars 2013, il renverra une date à laquelle il ne reste que 23 heures. Il se peut bien qu’il ait le 24, mais l’utilisation dans les calculs n’a été ajoutée qu’à 23h00.

De même, si vous avancez jusqu'au 28 octobre 2013, le code ajoute 25 heures, ce qui donne une date heure du 2013-10-28 01:00:00.

Afin d'ajouter un jour, je faisais la chose en haut, en ajoutant le:

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

Compliqué, principalement en raison de l'heure d'été.

2
Carl Hine
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]);
2
Shrikant Tanwade

Swift 4, si tout ce dont vous avez besoin est un poste de 24 heures (60 * 60 * 24 secondes) et non pas "1 jour calendaire"

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

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

1
John Robi

pour Swift 2.2:

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

J'espère que ça aide quelqu'un!

1
Paul Lehn

J'ai eu le même problème; utilisez une extension pour 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];
}
0
slashlos
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);
0
Vũ Ngọc Giang

Swift 2.0

let today = NSDate()    
let calendar = NSCalendar.currentCalendar()
let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)
0
iLandes

Swift 3+: essayez cette extension commune

extension Date {
    var startOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 1, to: sunday)
    }

    var endOfWeek: Date? {
        let gregorian = Calendar(identifier: .gregorian)
        guard let sunday = gregorian.date(from: gregorian.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)) else { return nil }
        return gregorian.date(byAdding: .day, value: 7, to: sunday)
    }

    var yesterdayDate: Date? {
        return NSCalendar.current.date(byAdding: .day, value: -1, to: noon)!
    }

    var tommorowDate: Date? {
        return NSCalendar.current.date(byAdding: .day, value: 1, to: noon)!
    }

    var previousDate: Date? {
        let oneDay:Double = 60 * 60 * 24
        return self.addingTimeInterval(-(Double(oneDay)))
    }

    var nextDate: Date? {
        let oneDay:Double = 60 * 60 * 24
        return self.addingTimeInterval(oneDay)
    }

    var noon: Date {
        return NSCalendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
    }

    var month: Int {
        return Calendar.current.component(.month,  from: self)
    }
}
0
svmrajesh