Как я могу определить, попадает ли определенный объект NSDate в определенный день? Поскольку все даты рассчитываются по часовому поясу GMT, на самом деле дата может быть, например, 8-го, а не 9-го числа. Как лучше всего учитывать разницу часовых поясов при вычислении таких вещей, как дни, месяцы, день недели и т. Д.
Определение компонентов дня объекта NSDate (проблемы с часовыми поясами)
Ответы (2)
2
NSDate - это абсолютный момент времени. Когда вы хотите знать, на какой день он приходится, вы должны учитывать свой часовой пояс. Поскольку вы получаете NSDateComponents с NSCalendar, вы можете использовать setTimeZone: в календаре, чтобы получить компоненты (месяц, день, час и т. Д.) Для интересующего вас часового пояса.
Если вы имеете дело с «календарными датами» (т.е. датами, которые всегда должны представлять определенный день / месяц, а не абсолютную точку времени), вы всегда можете использовать фиксированный часовой пояс (например, GMT) для представления дат. NSDateFormatter (который вы используете для отображения дат пользователю) также имеет свойство timeZone.
1
Вам необходимо установить желаемый часовой пояс в 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]