#iphone #objective-c #cocoa-touch
#iPhone #objective-c #cocoa-touch
Вопрос:
Есть ли способ вычесть текущую дату на 5
. скажем, если сегодня 2008-12-9
мне нужно вернуть дату на 5 дней назад. Если мы выведем это, дата должна отображаться как 2008-12-4
.
Как я могу запрограммировать это программно? или учебное пособие, которое помогло бы
Ответ №1:
Всегда используйте NSCalendar и NSDateComponents для вычисления даты. При этом будут учтены такие странности, как високосные годы с 29 днями в феврале, високосные секунды и переход на летнее время.
NSDate *date = [NSDate date]; // Using current date here
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = - 5; // Find date for 5 days ago
NSDate *newDate = [calendar dateByAddingComponents:components toDate:date options:0];
Ответ №2:
Используйте NSDateComponents
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease];
[offsetComponents setDays:-5];
NSDate *fiveDaysAgo = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];
чтобы преобразовать его в строку с предпочтительным форматом, используйте NSDateFormatter
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSString *formattedDateString = [dateFormatter stringFromDate:fiveDaysAgo];
Комментарии:
1. В некоторых месяцах есть 30 или 31 день, скажем, если сегодня
October 1st
, будет ли код знать, чтоSeptember
имеет только30 days
, и напечатать результат как25th Septemeber
?2. Должна
date
ли часть из строкиNSString *formattedDateString = [dateFormatter stringFromDate:date];
бытьfiveDaysAgo
изNSDate *fiveDaysAgo = ...
? Извините, я новичок
Ответ №3:
Это метод грубой силы:
- Извлеките
5
изDAY
. - Если
DAY < 0
, добавьте количество дней предыдущего месяца и вычтите1
изMONTH
. - Если
MONTH < 0
, добавьте номер месяца года и вычтите1
изYEAR
.
Преимущество метода грубой силы заключается в том, что он будет работать с любым языком.
Комментарии:
1. Если вы хотите сделать это правильно, вам нужно будет учитывать високосные годы и другие изменения календаря. Просто используйте NSCalendar.
2. @Robin Summerhill: Понижающий голос означает, что ответ бесполезен. Вы предполагаете, что мой метод не будет работать?
3. Я предполагаю, что в нынешнем виде это не точно, потому что оно не учитывает изменения календаря. Чтобы сделать это правильно, вы бы в основном дублировали то, что уже делает NSCalendar — поэтому используйте NSCalendar. Есть два других ответа на этот вопрос, которые предлагают лучший совет.
4. В этом нет ничего личного. Просто, если кто-то будет искать этот вопрос в будущем, ответы, которые предлагают правильный способ сделать это, должны быть в верхней части списка.
5. Я не принимаю это на свой счет, я просто не согласен. Я понимаю, почему вы не проголосовали бы за это, но я не понимаю, почему вы бы проголосовали за это. Я вижу три ответа, в которых используется практически одна и та же идея, и один другой (мой). Уже есть принятый ответ, который будет вверху. И я не говорю, что мой лучше, быстрее или короче, чем три других, но он правильный, дидактический и может быть легко реализован на любом языке программирования.
Ответ №4:
#define SOME_HOUR -24*5
NSDate *today = [NSDate date];
NSDate *someDay = [NSDate dateWithTimeInterval:60*60*SOME_HOUR sinceDate:today];
Комментарии:
1. из-за летнего времени дни могут длиться 23, 24 или 25 часов.