Как я могу определить, попадает ли определенный объект NSDate в определенный день? Поскольку все даты рассчитываются по часовому поясу GMT, на самом деле дата может быть, например, 8-го, а не 9-го числа. Как лучше всего учитывать разницу часовых поясов при вычислении таких вещей, как дни, месяцы, день недели и т. Д.
Вопрос
Определение компонентов дня объекта NSDate (проблемы с часовыми поясами)
- Я просто зашел в Stackoverflow, чтобы задать тот самый вопрос, а потом вижу его на первой странице...! gcamp 14.08.2011
- Что вы имеете в виду, говоря о часовом поясе? NSDate представляет собой конечный момент времени. Приведите пример того, что вы бы попытались сделать, и в чем заключалась потенциальная проблема. Moshe 14.08.2011
Ответы
Ответ 1 · рейтинг 2 · omz
NSDate - это абсолютный момент времени. Когда вы хотите знать, на какой день он приходится, вы должны учитывать свой часовой пояс. Поскольку вы получаете NSDateComponents с NSCalendar, вы можете использовать setTimeZone: в календаре, чтобы получить компоненты (месяц, день, час и т. Д.) Для интересующего вас часового пояса.
Если вы имеете дело с "календарными датами" (т.е. датами, которые всегда должны представлять определенный день / месяц, а не абсолютную точку времени), вы всегда можете использовать фиксированный часовой пояс (например, GMT) для представления дат. NSDateFormatter (который вы используете для отображения дат пользователю) также имеет свойство timeZone.
Ответ 2 · рейтинг 1 · hamstergene
Вам необходимо установить желаемый часовой пояс в 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]
Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.
Похожие материалы
- PrepareForSegue:sender: не удается изменить свойство в целевом виртуальном канале
- UINavigationController работает как модальный на iOS 7
- Представление представления XIB зависает
- Пользовательский переход не анимируется
- Отличается ли количество часовых поясов в зависимости от региона?
- Сохранение даты / времени как UTC в базе данных