Добавление дней в NSDate - PullRequest
       10

Добавление дней в NSDate

10 голосов
/ 17 ноября 2011

Я хочу добавить дни к дате, я получил много кодов для этого, но ни один из них не работает для меня, ниже показан мой код, пожалуйста, кто-нибудь, помогите мне решить эту проблему

int daysToAdd=[[appDlegateObj.selectedSkuData 
                                    objectForKey:@"Release Time"] intValue];

NSTimeInterval secondsForFollowOn=daysToAdd*24*60*60;

NSString *dateStr=[contentDic objectForKey:@"Date"];

NSDateFormatter *dateFormatter=[[NSDateFormatter alloc]init];

[dateFormatter setDateFormat:@"yyyy-MM-dd"];

NSDate *dateFromString=[[NSDate alloc]init];

dateFromString=[dateFormatter dateFromString:dateStr];

[dateFormatter release];

 NSDate *date=[dateFromString dateByAddingTimeInterval:secondsForFollowOn];

Ответы [ 9 ]

29 голосов
/ 17 ноября 2011
// Initialize stringified date presentation
NSString *myStringDate = @"2011-11-17";

// How much day to add
int addDaysCount = 30;

// Creating and configuring date formatter instance
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];

// Retrieve NSDate instance from stringified date presentation
NSDate *dateFromString = [dateFormatter dateFromString:myStringDate];

// Create and initialize date component instance
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:addDaysCount];

// Retrieve date with increased days count
NSDate *newDate = [[NSCalendar currentCalendar] 
                              dateByAddingComponents:dateComponents 
                                              toDate:dateFromString options:0];

NSLog(@"Original date: %@", [dateFormatter stringFromDate:dateFromString]);
NSLog(@"New date: %@", [dateFormatter stringFromDate:newDate]);

// Clean up
[dateComponents release], dateComponents = nil;
[dateFormatter release], dateFormatter = nil;

Выход:

Original date: 2011-11-17
New date: 2011-12-17
8 голосов
/ 09 июля 2013
    NSDate *now = [NSDate date];
    int daysToAdd = 1;
    NSDate *newDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
3 голосов
/ 28 октября 2014

С iOS 8 и 10.9 теперь вы можете сделать это намного проще.Вы можете добавить любое число любого календарного блока к дате.Я объявил метод NSDate очень маленькой категории, чтобы сделать это еще быстрее (так как мне просто нужно было добавлять дни в моем приложении).Код ниже.

-(NSDate *)addDaysToDate:(NSNumber *)numOfDaysToAdd {
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay value:numOfDaysToAdd.integerValue toDate:self options:nil];
    return newDate;
}

Ключевые вещи: NSCalendarUnitDay - это то, что я использовал, чтобы сообщить, что я хочу добавить дни.Вы можете изменить это на другие значения перечисления, такие как месяцы или годы.

Так как это категория на NSDate, я добавляю значение к себе.Если вы не хотите объявлять категорию, вы просто берете дату в параметрах метода, например:

-(NSDate *)addDays:(NSNumber *)numOfDaysToAdd toDate:(NSDate *)originalDate {
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay value:numOfDaysToAdd.integerValue toDate:originalDate options:nil];

    return newDate;
}

Я использую NSNumber, но вы легко можете просто использовать NSInteger.

Наконец, в Swift:

func addDaysToDate(daysToAdd: Int, originalDate: NSDate) -> NSDate? {
        let newDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.DayCalendarUnit, value: daysToAdd, toDate: originalDate, options: nil)
        return newDate
    }

Если вы хотите избавиться от NSDate?и почувствуйте себя комфортно, развернув возможный ноль (добавление даты может не получиться), вы можете просто вернуть newDate!и избавиться от?знак.

3 голосов
/ 17 ноября 2011

Вы можете добавить дни к NSDate, добавив временной интервал

NSDate* newDate = [date dateWithTimeInterval:3600*24*numberOfDays sinceDate:otherDate];

Хотя, если вы хотите быть очень точным, учитывать високосные секунды, время перехода на летнее время и все такоевещей, которые вы можете использовать NSDateComponents, как описано в Руководство по программированию даты и времени и ссылка Омтара .

2 голосов
/ 17 ноября 2011
NSDateComponents *offsetComponents = [[NSDateComponents alloc] autorelease];
[offsetComponents setDay:1];

newDate = [[[CalendarContainer sharedCalendarContainer] gregorian] dateByAddingComponents:offsetComponents toDate:currentlyDisplayedDate options:0];
2 голосов
/ 17 ноября 2011

Предлагаю вам прочитать эту статью для более чистого решения.

1 голос
/ 05 января 2016

в Swift 2.1.X и xcode 7.1 OSX 10.10.5, вы можете добавлять любое количество дней вперед и назад, используя функцию

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

вызов функции для увеличения текущей даты на 9 дней

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

вызов функции для уменьшения текущей даты на 80 дней

newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
print(newDate)
0 голосов
/ 08 января 2016

В Swift 2 используйте extension для расширения NSDate:

extension NSDate {

    func addDays(days:Int) -> NSDate{
        let newDate = NSCalendar.currentCalendar().dateByAddingUnit(
            .Day,
            value: days,
            toDate: self,
            options: NSCalendarOptions(rawValue: 0))

        return newDate!
    }
}
0 голосов
/ 17 ноября 2011
    NSDate *Date=[datePicker date];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd.MM.yy EEEE h:mm a"];
...