2009-07-21 5 views
25

Я хотел бы вычесть 4 часа с даты. Я прочитал строку даты в объекте NSDate, используя следующий код:Как вычесть часы из NSDate?

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSDate * mydate = [dateFormatter dateFromString:[dict objectForKey:@"published"]]; 

Что мне делать дальше?

+4

(Это теперь 6 лет и 4 основные версии XCode позже ... и функциональность NSDate по-прежнему так же неинтуитивна, как и в 2009 году!) –

ответ

23

NSCalendar - это общий API для изменения дат, основанных на единицах человеческого времени. Для этого вы можете использовать NSCalendar's -dateByAddingComponents:toDate:options: с отрицательным числом часов.

+0

Это гораздо лучший подход - он имеет дело с DST, високосные годы, все это. – drewh

+0

NSCalendar не рекомендуется использовать API. http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendarDate_Class/Reference/Reference.html – oberbaum

+10

@norskben: Эта страница предназначена для NSCalendar ** Дата **. Это то, что он говорит, чтобы не использовать. Он специально рекомендует NSCalendar в качестве замены в той же заметке. – Chuck

45
NSDate *newDate = [theDate dateByAddingTimeInterval:-3600*4]; 

Link to documentation.


NSDate *newDate = [[[NSDate alloc] initWithTimeInterval:-3600*4 
               sinceDate:theDate]] autorelease]; 

Link to documentation.

+0

старый вопрос, который я знаю, но addTimeInterval кажется устаревшим сейчас, есть ли причина для этого? –

+3

@DreamLane: Потому что это не использовало то же соглашение об именах, что и остальные API. 'addTimeInterval:' предполагает, что 'NSDate' является изменяемым, а это не так. –

+1

Спасибо за быстрый ответ, также спасибо за редактирование ответа с обновленным именем метода! +1 –

1

Hey Miriam,
Функция dateFromString возвращает NSDate, а не NSString. вы должны изменить,

NSDate * theDate = [dateFormatter dateFromString: datetemp];

надеюсь, что это поможет,
bests.
Г.

6

С прошивкой 8 есть более удобный dateByAddingUnit:

Swift 2.x

//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrentCalendar() 
newDate = calendar.dateByAddingUnit(.Hour, value: -3, toDate: originalDate, options: []) 
+1

Комментарий говорит, что вычитание, однако, 3 использовалось как значение, оно должно быть -3 – naz

+0

Спасибо, обновлено. –

4
//in Swift 3 
//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrent 
newDate = calendar.date(byAdding:.hour, value: -3, to: originalDate) 
Смежные вопросы