NSDate и разница часовых поясов - PullRequest
2 голосов
/ 15 марта 2012

Я уже некоторое время просматриваю документы Apple и стекопотока, но не смог найти правильный ответ для своей проблемы.Я постараюсь объяснить.В моем приложении пользователь может создавать измерения в определенное время.Дата и время измерения важны.

В моей категории NSDate + Helper я создал следующие вспомогательные методы:

- (NSDate *)dateByMovingToBeginningOfDay
{
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
    [parts setHour:0];
    [parts setMinute:0];
    [parts setSecond:0];
    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}

- (NSDate *)dateByMovingToEndOfDay {
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
    [parts setHour:23];
    [parts setMinute:59];
    [parts setSecond:59];
    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}

Этот метод помогает мне получить диапазон измерений отполный день:

NSDate *start = [[NSDate date] dateByMovingToBeginningOfDay];
NSDate *end   = [[NSDate date] dateByMovingToEndOfDay];

NSMutableSet *measurementsSet = [trainingsPlan measurementsWithType:@"used" fromDate:start andToDate:end];

Вот в чем заключается моя проблема. Допустим, я добавил измерение на моем симуляторе на 2012-03-14 0:42:59 (GMT+1), потому что это время, отображаемое на моем симуляторе, и сохранил его в основных данных.

[NSDate date] на данный момент равен 2012-03-13 23:42:59, поэтому NSDate *start = [[NSDate date] dateByMovingToBeginningOfDay]; дает мне дату начала предыдущего дня.Это проблема.

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

1 Ответ

3 голосов
/ 15 марта 2012

Если вы хотите использовать одни и те же данные в нескольких часовых поясах, тогда единственный вариант - использовать один и тот же часовой пояс в приложении, независимо от того, в какое время iPad сообщает.Обычно для этой цели вы используете UTC (и это часовой пояс по умолчанию, в котором создаются и сохраняются временные пояса).

Если вы просто хотите, чтобы он совпадал с местным часовым поясом, вам нужно изменить свои подпрограммы следующим образом:

- (NSDate *)dateByMovingToBeginningOfDay
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents* parts = [calendar components:flags fromDate:self];
    [parts setHour:0];
    [parts setMinute:0];
    [parts setSecond:0];

    return [calendar dateFromComponents:parts];
}

Обновите вторую процедуру таким же образом.

...