Рассчитать даты на основе определенного часового пояса - PullRequest
2 голосов
/ 14 ноября 2010

Использование NSDate сложно для меня.Я знаю, что это представляет конкретный момент времени, не привязанный к конкретному часовому поясу или локали.Я также много читал в документах по NSDateFormatter, NSCalendar, NSDateComponents, NSlocale и NSTimeZone.

Я пытаюсь выполнять вычисления на основе двух конкретных тихоокеанских часовых поясов.Например, я хочу иметь возможность подсчитывать количество дней от даты A до даты B. Я не хочу «взламывать» его, анализируя строки, поскольку я хочу, чтобы такие вещи, как DST, также рассчитывались.

Кто-нибудь может порекомендовать способ сделать это?

Редактировать: Найденное решение:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSTimeZone *zone = [NSTimeZone timeZoneWithName:@"PST"];
[calendar setTimeZone:zone];
NSDateComponents *comp = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];
date = [calendar dateFromComponents:comp];
[calendar release];

Это приводит к дате, локализованной по тихоокеанскому времени.Я знаю, что это вызывает проблемы в разных локалях, но мое приложение уникально, и это оправдано.

Затем я могу сравнить даты, используя деление на 86400, как было опубликовано.

Хотя, похоже,например, излишнее количество - много дополнительной работы - может быть, есть более короткий способ получить дату с определенным часовым поясом?

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

Вы также можете конвертировать оба объекта NSDate в GMT.Например:

NSDate *date;
NSTimeZone *timeZone;
NSDate *gmtDate = [date dateByAddingTimeInterval:-[timeZone secondsFromGMTForDate:date]];

А затем установите часовой пояс NSCalendar на GMT.Например:

NSCalendar *calendar;
[calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0];

Затем вы можете использовать календарь и даты по Гринвичу, чтобы вычислить все, что вам нужно знать.

3 голосов
/ 14 ноября 2010

Полагаю, вы могли бы рассчитать разницу между часовыми поясами. Как это:

NSDate *date1;
NSDate *date2;
NSTimeInterval dateDifference = [date1 timeIntervalSinceDate:date2];

Затем рассчитайте разницу часовых поясов. Как это:

NSTimeZone *timeZone1;
NSTimeZone *timeZone2;
// Assuming date1 is in timeZone1...
NSTimeInterval timeZoneDifference = [timeZone1 secondsFromGMTForDate:date1] - [timeZone2 secondsFromGMTForDate:date2];

Тогда сложите два. Как это:

NSTimeInterval difference = dateDifference + timeZoneDifference;
2 голосов
/ 14 ноября 2010

Вы должны создать два NSDate экземпляра, которые представляют две даты, которые вы хотите сравнить. Для этого вы можете настроить NSDateComponents экземпляров и установить не только их день / месяц / год / час, но и часовой пояс (-[NSDateComponents setTimeZone:]). Затем позвоните -[NSDateComponents date], чтобы преобразовать их в NSDate.

[date1 timeIntervalSinceDate:date2] затем дает разницу (в секундах) между двумя датами. Разделите результат на 86 400, чтобы получить количество дней.

Кроме того, вы можете напрямую вызвать [NSCalendar components:fromDate:toDate:options:] с NSDateComponent экземплярами, чтобы получить NSDateComponents с разницей между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...