Получение неправильной даты с initWithTimeInterval: sinceDate: - PullRequest
0 голосов
/ 23 августа 2010

У меня есть дата, 2010-08-23 13:30:00 -0400, и я пытаюсь получить ее в часовом поясе UTC +2. Разница в секундах составляет 21600, но когда я звоню [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];, я получаю 2010-08-24 01:30:00 +0200, который должен быть 2010-08-23 19:30:00 +0200. Есть идеи, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Объект даты представляет определенный момент времени, независимо от того, что часы разных людей могли бы сказать в то время.

Когда вы хотите отобразить дату, включаются часовые пояса, так как вы обычно отображаетечто бы часы пользователя сказали (или говорят, или скажут) в это время.Это именно то, что происходит, когда вы NSLog NSDate: описание даты - это тот момент времени, который представлен в вашем местном часовом поясе.

Добавление или вычитание из NSDate не является преобразованием часового пояса.Сложение и вычитание производят NSDates, представляющие другие моменты времени;в вашем случае вы создаете NSDate на мгновение спустя 6 часов с того момента, как вы начали, не в тот же момент на другой стороне планеты.

Для упрощения,преобразование часового пояса рассматривает в одно и то же время в в различных точках в пространстве (в разных частях поверхности планеты), тогда как сложение и вычитание даты вычисляют разные времена .

Для NSDate нет преобразования часового пояса, потому что он не находится в часовом поясе с самого начала.Часовой пояс включается только тогда, когда вы форматируете дату для этого часового пояса.Итак, чтобы отобразить эту дату в другом часовом поясе, просто сделайте это.Обычно это означает предоставление нужного часового пояса вашему форматеру даты .

1 голос
/ 23 августа 2010

Я вижу, что дата, которую вы получите, имеет другой часовой пояс +200, а не -400. Если вы заметите, вы увидите, что этот результат на 12 часов (или 6 часов + 6 часов) позже вашей первоначальной даты. Вы случайно изменили локаль, когда сделали новую дату? Когда вы внесли изменение, которое начало давать вам +200 вместо -400, система автоматически скорректировала время для компенсации, затем вы добавили еще 6 часов к дате. NSDate сохраняет все даты как интервал времени с 1 января 2001 года по Гринвичу и при необходимости корректирует часовые пояса.

...