Определение компонентов дня объекта NSDate (проблемы с часовыми поясами)

Как я могу определить, попадает ли определенный объект NSDate в определенный день? Поскольку все даты рассчитываются по часовому поясу GMT, на самом деле дата может быть, например, 8-го, а не 9-го числа. Как лучше всего учитывать разницу часовых поясов при вычислении таких вещей, как дни, месяцы, день недели и т. Д.


person Geoff Lee    schedule 14.08.2011    source источник
comment
Я просто зашел в Stackoverflow, чтобы задать тот самый вопрос, а потом вижу его на первой странице…!   -  person gcamp    schedule 14.08.2011
comment
Что вы имеете в виду, говоря о часовом поясе? NSDate представляет собой конечный момент времени. Приведите пример того, что вы бы попытались сделать, и в чем заключалась потенциальная проблема.   -  person Moshe    schedule 14.08.2011


Ответы (2)


NSDate - это абсолютный момент времени. Когда вы хотите знать, на какой день он приходится, вы должны учитывать свой часовой пояс. Поскольку вы получаете NSDateComponents с NSCalendar, вы можете использовать setTimeZone: в календаре, чтобы получить компоненты (месяц, день, час и т. Д.) Для интересующего вас часового пояса.

Если вы имеете дело с «календарными датами» (т.е. датами, которые всегда должны представлять определенный день / месяц, а не абсолютную точку времени), вы всегда можете использовать фиксированный часовой пояс (например, GMT) для представления дат. NSDateFormatter (который вы используете для отображения дат пользователю) также имеет свойство timeZone.

person omz    schedule 14.08.2011

Вам необходимо установить желаемый часовой пояс в NSCalendar, прежде чем использовать его для разбивки даты на части:

NSCalendar* gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:[NSTimeZone localTimeZone]]; // or timeZoneWithName:@"GMT" etc.

unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSDateComponents* compsDate = [gregorian components:unitFlags fromDate:date];
// [compsDate year] [compsDate month] [compsDate day] 
person hamstergene    schedule 14.08.2011