разница в логической дате записи — новичок

#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:

Это метод грубой силы:

  1. Извлеките 5 из DAY .
  2. Если DAY < 0 , добавьте количество дней предыдущего месяца и вычтите 1 из MONTH .
  3. Если 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 часов.