Comment ajouter 1 jour à une NSDate?

320

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

Donc si c'était le cas:

21st February 2011

Cela deviendrait:

22nd February 2011

Ou si c'était:

31st December 2011

Cela deviendrait:

1st January 2012.
Andrew
la source
4
Notez qu'un NSDate ne représente pas une date, il représente un point dans le temps. Cela comprend donc une heure ainsi qu'une date.
Rog
4
D'accord - vous devriez utiliser la réponse de Zack German ci-dessous. Consultez le Guide de programmation de la date et de l'heure d' Apple .
Ash Furrow
Faites défiler vers le bas pour des solutions plus récentes (et plus courtes)!
catanore

Réponses:

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

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

Cela devrait être explicite.

Zaky German
la source
19
Vous pouvez également utiliser des composants négatifs pour soustraire d'une date.
DataGraham
58
Une bien meilleure solution que la réponse choisie
Justin Meiners
19
+1 pour l'utilisation des composants Date plutôt que pour l'ajout d'une journée de secondes.
Abizern
Oui, fonctionne bien pour l'heure d'été. Astuce pour la vérification de l'heure d'été: Réinitialisez la date et l'heure sur votre Mac, puis redémarrez votre simulateur, il suivra ensuite l'heure de votre système.
Rob van den Berg, du
2
Dans Swift, vous devez modifier le dernier paramètre de l' dateByAddingComponents appel àNSCalendarOptions(rawValue: 0)
gfpacheco
270

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)
Ben Sinclair
la source
5
Est-ce juste moi, ou ne serait-il pas beaucoup plus simple pour Swift de construire quelque chose comme ça date.add(.days, 1)? * va et construit une extension
quemeful
2
@quemeful extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }usageDate().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
Leo Dabus
82

Mis à jour pour Swift 5

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

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];
iHS
la source
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
la source
Notez que vous ne pouvez pas masquer l'unité ici (utilisez-en une seule).
catanore
31

Une implémentation de Swift 3+ fonctionnelle basée sur la réponse de Highmaintenance et le commentaire de Vikingosegundo . Cette extension de date propose é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 ajouter un jour comme demandé par OP serait alors:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)
Benno Kress
la source
2
Vous pouvez raccourcir massivement le code en utilisant des composants de date.
vikingosegundo
Vous avez raison, bien qu'il présente des inconvénients à mon avis: - le code utilisant l'extension ne semble pas aussi propre - il ouvre des options inutiles avec des composants qui n'ont pas de sens comme let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] si j'ajoutais la solution alternative à ma réponse . Merci pour votre suggestion, @vikingosegundo!
Benno Kress
3
eh bien, je voulais dire quelque chose de différent: gist.github.com/vikingosegundo/31ddb14920415ef444a9ab550411d4ff
vikingosegundo
22

Swift 4.0 (identique à Swift 3.0 dans cette merveilleuse réponse, pour que ce soit clair pour les débutants comme moi)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)
Joshua Dance
la source
3
Avez-vous oublié de changer le nom de votre variable?
Rakesha Shastri
13

Utilisez la fonction ci-dessous et utilisez le paramètre jours pour obtenir la date daysAhead / daysBehind juste passer le paramètre comme 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;
}
Bhupendra
la source
10

En rapide

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

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

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];
DenZhukov
la source
Eh bien apparemment, cette question est le paradis du vidage de code. Donc, aucune raison de vous distinguer.
Drew
2
ma réponse est plus correcte car si vous utilisez l'option NSCalendarWrapComponents (0), vous ne pouvez créer une date que dans la plage du mois en cours. Cela signifie que si vous ajoutez 1 jour avec NSCalendarWrapComponents au 31 janvier 2016, vous obtiendrez le 1er janvier 2016. Avec l'option NSCalendarMatchStrictly, vous obtiendrez la prochaine date de calendrier.
DenZhukov
8

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)!
}
AmJa
la source
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
la source
5

Swift 4.0

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

Usage

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.

quemeful
la source
3

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

Tiago
la source
3
AddByTimeInterval de NSDate a été déconseillé dans iOS 4 ( bit.ly/vtOzvU ). Utilisez plutôt dateByAddingTimeInterval ( bit.ly/vRkFrN ).
billmaya
4
les jours peuvent avoir 23, 24 ou 25 heures, en raison des heures d'été.
vikingosegundo
3

Dans Swift 2.1.1 et xcode 7.1 OSX 10.10.5, vous pouvez ajouter n'importe quel nombre 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)
Dharmesh
la source
3

Voici une méthode à usage général qui vous permet d'ajouter / de 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
n.by.n
la source
3
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 une journée au 31 mars 2013, il renverra une date qui n'a que 23 heures ajoutées. Il pourrait bien avoir le 24, mais l'utilisation dans les calculs n'a ajouté que 23 heures.

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

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

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

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

Carl Hine
la source
une fois par an ne compte que 23 heures. une fois 25. et toutes les quelques années, il a la longueur en 60*60*24 + 1raison de secondes intercalaires. les dates doivent couvrir tout cela, et c'est pourquoi la gestion des dattes du cacao est vraiment géniale!
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
la source
2

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)
Muhammad Aamir Ali
la source
2

Mise à jour pour 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
la source
1

pour swift 2.2:

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

J'espère que cela aide quelqu'un!

Paul Lehn
la source
1

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

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

Passé: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))

John Robi
la source
1

mise à jour pour swift 5

let nextDate = fromDate.addingTimeInterval(60*60*24)
Manish
la source
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
la source
0

J'ai eu le même problème; utiliser 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];
}
slashlos
la source
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
la source
0

Dans swift 4 ou swift 5, vous pouvez utiliser comme ci-dessous:

    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)

production:

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

Extension de chaîne: Convert String_Date> Date

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

Extension de date: Convertir la date> Chaîne

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

Extension de date: 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!
 }
}

Usage:

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

référence: à partir de plusieurs questions
Comment ajouter 1 jour à une NSDate?
fonction mathématique pour convertir un positif positif en négatif et un négatif en positif?
Conversion de NSString en NSDate (et inversement)

Muhammad Asyraf
la source
-1

Utilisez le code suivant:

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

Comme

addTimeInterval

est désormais obsolète.

Hemang
la source
3
les jours peuvent avoir 23, 24 ou 25 heures, en raison des heures d'été
vikingosegundo