Делаете сравнение на NSDates в разных часовых поясах? - PullRequest
5 голосов
/ 13 января 2010

У меня есть массив NSDates, который я строю из строк, используя [NSDate dateFromString] В xml, который я проанализировал, чтобы получить строку, была также строка часового пояса. Насколько я вижу в руководстве, NSDate само по себе не относится к часовым поясам. Нужно ли мне всегда хранить это значение часового пояса и связывать его с принадлежащим NSDate каждый раз, когда мне это нужно?

Мне также нужно выяснить, что если событие начинается в Лондоне в 10:00, но я нахожусь в Дании, когда мой iPhone настроен на датское время, мое «событие, начатое в Лондоне» должно отображаться в 09:00.

Опять же, если событие начинается в Лондоне в 10:00 и заканчивается в Дании в 12:00, если бы я сравнивал время начала и время окончания, используя iPhone с датскими настройками, я бы понял, что продолжительность мероприятия была 02:00, хотя в 10:00 в Великобритании и 12:00 в Дании с интервалом всего 1 час.

NSdate работает очень хорошо для этих вещей в рамках одного часового пояса, но введение части часового пояса только усложнило мне все. Есть ли способ абстрагировать / скрыть все эти вычисления, так как я вижу потенциал для совершения множества ошибок.

Я прошел через руководства NSDateformatter и NSDate от Apple, но они действительно расплывчаты и содержат значительное количество устаревшего кода: /

Спасибо за любую помощь.

Ответы [ 4 ]

1 голос
/ 14 января 2010

Я конвертирую текущую дату и дату, которую я хотел бы знать, если она близка, в GMT, а затем возвращаю разницу. Поэтому я изменил каждую вещь, чтобы иметь дело с различиями, а не с фактическим временем и датами. Немного похоже на партитуру, перенесенную на другой ключ:)

+ (NSInteger) minutesUntilDate:(NSDate*) date withTimezoneOffset:(NSInteger) GMTOffset     
{

 NSDate *now = [NSDate date];
 NSTimeInterval localTimeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT];

 now = [now addTimeInterval:(localTimeZoneOffset * -1)];

 date = [date addTimeInterval:(GMTOffset * 60 * 60) * −1];

 return ((NSInteger)[now timeIntervalSinceDate:date] / 60 ) * -1;
}
1 голос
/ 13 января 2010

Согласно ссылке NSDate , dateWithString: принимает смещение по Гринвичу в качестве последнего компонента; хотя это не часовой пояс, достаточно выполнить вычисления или сравнение).

Глядя на ссылку NSTimeZone , вы можете использовать abbreviationForDate: и timeZoneWithAbbreviation:, чтобы получить NSTimeZone объект из NSDate экземпляра. Как только вы получите часовой пояс, у вас есть все, что вам нужно.

1 голос
/ 13 января 2010

Вы должны взять один стандартный часовой пояс, такой как формат UTC / GMT, для всех расчетов.

0 голосов
/ 14 января 2010

Как только вы выделили NSDate, у них больше нет информации о часовом поясе. NSDate «без часового пояса» и всегда в GMT. Вы должны убедиться, что NSDate правильно понимает ваш формат при его выделении.

Получив NSDate, вы можете выполнять обычные вычисления и игнорировать часовые пояса.

Вам нужно заботиться о часовых поясах только при чтении строк в NSDates и при их распечатке.

...