2011-12-20 2 views
3

Я хочу преобразовать мою локальную дату ([NSDate date]) в GMT для создания строки JSON (/ Date (1324435876019-0000) /).NSDate to GMTDate to JSON format

Мой код отлично работает, когда я устанавливаю часы в часовой пояс EST, когда меняю свой часовой пояс на PST, мой код по-прежнему действует как EST. Не могли бы вы рассказать мне, в чем проблема, следующий код?

 NSDate *localDate = [NSDate date]; 
    NSTimeInterval timeZoneOffset = [[NSTimeZone systemTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 
    NSString *time = [NSString stringWithFormat:@"/Date(%@-0000)/", [NSNumber numberWithLongLong:[gmtDate timeIntervalSince1970] * 1000]]; 
+0

Текущее время 2011-12-20 5:15:00 +0000 Но если я NSLog gmtDate я получаю из положить как 1) ESt тим зона: 2011-12-21 03:15: 00 +0000 2) Зона PSTtime: 2011-12-21 06:15:00 +0000. Это неправильно. Я думаю, что я не получаю правильную дату в формате GMT. Что ты думаешь ? – AAV

ответ

7

Вы можете получить время эпохи GMT простого вызова timeIntervalSince1970.

NSString *time = [NSString stringWithFormat:@"/Date(%lld-0000)/", 
        (long long)([[NSDate date] timeIntervalSince1970] * 1000)]; 
+0

Первое, что времяIntervalSince1970 даст вам второе, и нам нужно передать миллисекунду для JSON. Сначала я реализовал эту логику, но я не смог найти правильный ответ. – AAV

+0

Обновленный ответ. Вам не нужно делать вычисления в часовом поясе, чтобы получить время по Гринвичу, что один лайнер - это все, что вам нужно. – Joe

+0

@AmitVyawahare: timeIntervalSince1970 использует секунды как свои единицы, но возвращает NSTimeInterval, который является двойным, с довольно небольшим количеством дробной точности. Поэтому решение Джо является правильным и должно дать вам разрешение в миллисекундах. – Tommy

0

@joe и @tommy вы правы. Даже я реализовал то же самое, что и вы упомянули. Проблема была в базе данных сервера. Я нашел хак. Мне просто нужно добавить 18000 (5 часов) секунд к текущей местной дате, и я хорош. Так код

 NSDate *localDate = [NSDate date]; 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] + 18000; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

    NSString *time = [NSString stringWithFormat:@"/Date(%@-0000)/", [NSNumber numberWithLongLong:[gmtDate timeIntervalSince1970] * 1000]]; 
+0

Это не очень хорошее решение (как вы знаете, так как вы использовали слово hack), не забывайте, что есть «EST» и «EDT». Вашему серверу просто нужно отобразить время в правильном часовом поясе, возможно, решение заключается в замене «-0000» на «-0500» (EST)/«- 0400» (EDT). – Joe

+0

Вы правы, взломать нехорошо, но до того, как сервер точки не исправлен, я должен использовать тот же код терапии. Спасибо, --AV – AAV