2015-10-28 2 views
0

Я пытаюсь добавить день к другому (он отлично работает, пока я не увидел что-то).Добавление дня к дате с помощью NSCalendar

За неделю 6 в 2016 году (начиная с 30 января), если у меня был день к этой дате, он показывает мне 31 декабря 2015.

Можете ли вы объяснить мне, что я делаю неправильно ?

Вот код (вы можете поместить его в детскую площадку):

let weekToDisplay = 6 
let yearToDisplay = 2016 

let calendar = NSCalendar.currentCalendar() 
let comp = NSDateComponents() 
comp.weekday = calendar.firstWeekday 
comp.weekOfYear = weekToDisplay 
comp.year = yearToDisplay 

let dateToIncrement = calendar.dateFromComponents(comp)! // "Jan 31, 2016, 12:00 AM 
var incrementedDate = calendar.dateByAddingUnit(.Day, value: 1, toDate: dateToIncrement, options: NSCalendarOptions.WrapComponents)! // "Jan 1, 2016, 12:00 AM" 

print(dateToIncrement) // "2016-01-30 23:00:00 +0000\n" 
print(incrementedDate) // "2015-12-31 23:00:00 +0000\n" 

Последняя вещь, когда вы печатаете дату, это не то же самое, как показано на детской площадке при выполнении этой конкретной строки кода , Зачем ? (См комментарии)

+1

Вы не хотите обертывать дополнение. – rmaddy

+0

Ответ rmaddy правильный. Это понятно и точно. (Проголосовали). Вы должны согласиться с этим, а не с Уильямом, поскольку его первоначальный ответ был неправильным способом сделать это, и его обновленный ответ был грязным и запутанным. –

+0

@ DuncanC действительно мой обновленный ответ смущен? –

ответ

1

Ваш вопрос является возможность обернуть компоненты даты. Вы этого не хотите. Просто выполните:

let weekToDisplay = 6 
let yearToDisplay = 2016 

let calendar = NSCalendar.currentCalendar() 
let comp = NSDateComponents() 
comp.weekday = calendar.firstWeekday 
comp.weekOfYear = weekToDisplay 
comp.year = yearToDisplay 

let dateToIncrement = calendar.dateFromComponents(comp)! // "Jan 31, 2016, 12:00 AM 
var incrementedDate = calendar.dateByAddingUnit(.Day, value: 1, toDate: dateToIncrement, options: [])! // "Jan 1, 2016, 12:00 AM" 

print(dateToIncrement) 
print(incrementedDate) 
+0

Это далеко и далеко лучший ответ (проголосовали), и вы должны принять этот, а не другой. –

+0

Хорошо, я принял это как правильный ответ. Возможно, мне нужно проверить документацию Apple, чтобы узнать, что означают опции. Благодарю вас @rmaddy, я ценю –

0

, чтобы решить вашу проблему, здесь вы идете:

let weekToDisplay = 6 
let yearToDisplay = 2016 

let calendar = NSCalendar.currentCalendar() 
let comp = NSDateComponents() 
comp.weekday = calendar.firstWeekday 
comp.weekOfYear = weekToDisplay 
comp.year = yearToDisplay 

let dateToIncrement = calendar.dateFromComponents(comp)! // "Jan 31, 2016, 12:00 AM 

print(dateToIncrement) // "2016-01-30 23:00:00 +0000\n" 


let incrementedDate = calendar.dateByAddingUnit(.Day, value: 1, toDate: dateToIncrement, options: .MatchStrictly) // "Feb 1, 2016, 12:00 AM" 
+0

Я думаю, что 'NSCalendar' справляется с летним временем лучше –

+3

Никогда не делайте календарную математику, добавляя значения« NSTimeInterval ». – rmaddy

+0

Это работает, но если комментарии говорят, что не использовать его, есть ли другая альтернатива? –

Смежные вопросы