Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Geoff LeeОтветов: 2

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

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

objective-ctimezonensdate

Ответы

Ответ 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.

Похожие материалы