Как добавить 1 день к NSDate? - PullRequest
       71

Как добавить 1 день к NSDate?

300 голосов
/ 21 февраля 2011

В основном, как говорится в названии.Мне интересно, как я мог бы добавить 1 день к NSDate.

Так что если бы это было:

21st February 2011

Это стало бы:

22nd February 2011

Илиесли бы это было:

31st December 2011

Это стало бы:

1st January 2012.

Ответы [ 24 ]

687 голосов
/ 21 февраля 2011
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);

Это должно быть само за себя.

251 голосов
/ 20 ноября 2014

Начиная с iOS 8 вы можете использовать NSCalendar.dateByAddingUnit

Пример в 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)
58 голосов
/ 21 февраля 2011

Цель 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];

Обновлено для Swift 5

let today = Date()
let nextDate = Calendar.current.date(byAdding: .day, value: 1, to: today)
34 голосов
/ 20 ноября 2014

iOS 8+, OSX 10.9+, Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];
23 голосов
/ 09 сентября 2016

рабочая реализация Swift 3 & 4 на основе ответа highmaintenance и комментария vikingosegundo .Это продление Даты также имеет дополнительные опции для изменения года, месяца и времени:

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

}

Использование для добавления только дня в соответствии с запросом OP будет тогда:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)
21 голосов
/ 17 марта 2018

Swift 4.0 (так же, как Swift 3.0 в , этот замечательный ответ , который дает понять новичкам, как я)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)
12 голосов
/ 12 февраля 2013

Используйте приведенную ниже функцию и используйте параметр days, чтобы получить дату daysAhead / daysBehind, просто передавая параметр как положительный для будущей даты или отрицательный для предыдущих дат:

+ (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;
}
10 голосов
/ 18 января 2015

В быстром

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)
8 голосов
/ 12 октября 2016

Swift 3.0 очень простой реализацией будет:

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}
7 голосов
/ 25 февраля 2016

Это работа!

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