Определение дневных компонентов объекта NSDate (проблемы с часовым поясом) - PullRequest
1 голос
/ 14 августа 2011

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

Ответы [ 2 ]

2 голосов
/ 14 августа 2011

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

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

1 голос
/ 14 августа 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] 
...