Выполнение сравнения на NSDates в различных часовых поясах?

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

Я также должен выяснить что, если событие запускается в Лондоне в 10:00, но я нахожусь в Дании, устанавливающей мой iPhone на датское время, мое "событие, запущенное в Лондоне", должно отобразить в 9:00 час.

Снова, если событие запускает в Лондоне в 10:00 час и концы в Дании в 12:00 час, Если бы я должен был сравнить время начала и время окончания с помощью iPhone с датскими настройками, то я получил бы это, продолжительность события была 2:00 события, хотя 10:00 часа в Великобритании и 12:00 часа в Дании на расстоянии только в 1 час.

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

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

Спасибо за любую данную справку.

5
задан RickiG 13 January 2010 в 09:04
поделиться

4 ответа

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

1
ответ дан 15 December 2019 в 06:27
поделиться

Работаете ли вы в режиме профилирования или просто статическом анализе? Режим профилирования - это то, что вам нужно для этого, я думаю. Но я верю, что есть лучшие решения.

Можно попробовать SysInternals ProcMon . Это позволит вам увидеть, какой файл он пытается загрузить по крайней мере, и оттуда вы, возможно, сможете выяснить, в чем проблема.

Мой совет состоит в том, чтобы запустить его, а затем отключить ведение журнала. Перейдите к точке, где должно произойти исключение, снова включите ведение журнала, перейдите к отладчику, чтобы сгенерировать ошибку, затем снова отключите ведение журнала. Это оставит вам лишь небольшое количество журнала, чтобы иметь дело с, иначе он может получить довольно громоздко довольно быстро.

-121--1621900-

Я преобразую текущую дату и дату, которые я хотел бы знать, близки ли, в 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
ответ дан 15 December 2019 в 06:27
поделиться

, Как только вы выделили NSDate, они не имеют информации о часовом поясе больше. NSDate является "часовым поясом меньше" и всегда находится в GMT. Необходимо удостовериться, что NSDate понимают формат правильно при выделении его.

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

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

0
ответ дан 15 December 2019 в 06:27
поделиться

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

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

1
ответ дан 15 December 2019 в 06:27
поделиться