Изменение NSDate для представления 1 месяца с сегодняшнего дня

Здесь другое решение с командой «rename»:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
16
задан Ned Batchelder 10 November 2008 в 02:52
поделиться

4 ответа

(Почти то же как этот вопрос .)

От документация :

Использованию NSCalendarDate сильно препятствуют. Это еще не удерживается от использования, однако это может быть в следующей главной версии ОС после Mac OS X v10.5. Для calendrical вычислений необходимо использовать подходящие комбинации NSCalendar, NSDate и NSDateComponents, как описано в Календарях в Даты и время, Программируя Темы для Какао .

Следование, что совет:

NSDate *today = [NSDate date];

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth];

NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today];

nextMonthComponents.day = todayDayComponents.day;
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release];

может быть более прямое или эффективное внедрение, но это должно быть точно и должно указать в правильном направлении.

37
ответ дан 30 November 2019 в 15:21
поделиться

Я буду, вероятно, использовать NSCalendarDate.

Получают dayOfMonth текущей даты, monthOfYear и yearOfCommonEra, как три числа.

Добавляют необходимое число месяцев (1/3/6/9), заботясь о 1), существует ли та дата (например, 31 апреля, 29 февраля на невисокосном годе), и 2) трансформация года.

Создают ту новую дату с initWithYear:month:day:hour:minute:second:timeZone NSCalendarDate:

0
ответ дан 30 November 2019 в 15:21
поделиться

NSCalendarDate больше не поддерживается новым SDK, будет иметь проблему при создании для распределения.

0
ответ дан 30 November 2019 в 15:21
поделиться

Используйте NSCalender, NSDateComponents и NSDate:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

Просто установите различные свойства компонентов , чтобы получить разные периоды времени (например, 3 месяцев, 6 месяцев и т. д.).

Примечание. В зависимости от контекста вы можете использовать [[[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar] autorelease] вместо [NSCalendar currentCalendar] , если на "1 month "вы имеете в виду" 1 месяц по григорианскому календарю ".

22
ответ дан 30 November 2019 в 15:21
поделиться