Подтвердить что ты не робот

NSDate - конвертировать дату в GMT

Мне нужна возможность конвертировать значение NSDate в Date GMT.

Как мне преобразовать значение NSDate в значение NSDate, отформатированное по GMT, независимо от любых настроек языкового стандарта даты, которые использует iPhone?

4b9b3361

Ответ 1

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm";

    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormatter setTimeZone:gmt];
    NSString *timeStamp = [dateFormatter stringFromDate:[NSDate date]];
    [dateFormatter release];

Ответ 2

Работа со временем в Cocoa может быть сложной. Когда вы получаете объект NSDate, он находится в локальном часовом поясе. [[NSTimeZone defaultTimeZone] secondsFromGMT] дает вам смещение текущего часового пояса от GMT. Затем вы можете сделать это:

NSDate *localDate = // get the date
NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method
NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset;
NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval];

Теперь gmtDate должна иметь правильную дату в GMT для вас. Чтобы отобразить его, посмотрите NSDateFormatter, в частности методы setDateStyle и setTimeStyle. Вы создаете NSDateFormatter, настраиваете его так, как хотите, а затем вызываете stringFromDate:, чтобы получить красиво отформатированную строку.

Ответ 3

Howard Answer является правильным и, пожалуйста, проголосуйте за него и примите его.

Для справки, я думаю, полезно объяснить разницу между объектами даты и представлениями локализованных дат.

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

Если за каждый момент времени мы могли бы построить уникальную метку, эта метка могла бы быть передана и однозначно указана. Цель объектов даты - действовать как уникальная универсальная метка для заданного момента времени.

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

Примером может быть использование числового смещения от универсального события (через X секунд после взорвания солнца).

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

(Локальная строка даты) + ( Форматирование даты) = > Точка времени

Точка времени + (Форматирование даты) = > ( Строка локальной даты)

Каждый момент времени является универсальным... нет такой точки, как точка времени , или точка времени gmt, только после преобразования точки времени в локальная строка (с использованием форматирования даты) делает какую-либо связь с часовым поясом.

Примечание. Я уверен, что в этой самой теме много блогов/статей, но мой google foo терпит неудачу в этот час. Если у кого-то есть энтузиазм для расширения этой проблемы, пожалуйста, не стесняйтесь делать это.

Ответ 4

В то время как ответ Алекс был хорошим началом, он не занимался DST (летнее время) и добавил ненужное преобразование в/из контрольной даты. Для меня работает следующее:

Для преобразования из localDate в GMT, принимая во внимание DST:

NSDate *localDate = <<your local date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:localDate];
NSDate *gmtDate = [localDate dateByAddingTimeInterval:-timeZoneOffset]; // NOTE the "-" sign!

Для преобразования из даты GMT в localDate с учетом DST:

NSDate *gmtDate  = <<your gmt date>>
NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMTForDate:gmtDate];
NSDate *localDate = [gmtDate dateByAddingTimeInterval:timeZoneOffset];

Одно небольшое примечание: я использовал dateByAddingTimeInterval, который только для iOS 4. Если вы используете OS 3 или ранее, используйте addTimerInterval.

Ответ 5

Вы пробовали посмотреть документацию для NSDateFormatter?

NSDateFormatter

NSDateFormatter, похоже, имеет некоторые методы для воспроизведения с часами, в частности

-setTimeZone:

Я не тестировал его сам, но я полагаю, что если вы установите GMT ​​как часовой пояс на дату, которая первоначально представлена ​​в другом часовом поясе, она отобразит дату с правильными настройками, соответствующими новому часовому поясу.