2011-04-13 2 views

ответ

23
NSDate *sourceDate = [NSDate dateWithTimeIntervalSinceNow:3600 * 24 * 60]; 
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 
float timeZoneOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]/3600.0; 
NSLog(@"sourceDate=%@ timeZoneOffset=%d", sourceDate, timeZoneOffset); 
+4

Существует два потенциальных проблемы с этим кодом: (1) он должен действительно использовать «localTimeZone» вместо «systemTimeZone» (который обычно заканчивается тем же). (2) sourceDate должен быть [NSDate date], я столкнулся с проблемой, когда timeZoneOffset ошибся на час при использовании заданной даты вне дня. Можете ли вы объяснить, почему вы используете дату источника, отличающуюся от дня? –

59

Существует очень хороший объект NSTimeZone, который даст вам смещение часового пояса от GMT в секундах:

float timezoneoffset = ([[NSTimeZone systemTimeZone] secondsFromGMT]/3600.0); 

подробнее см блоге

http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/

+7

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

+2

Просто хотел добавить, что этот код позволяет избежать некоторых потенциальных ошибок ответа, отмеченного как правильное. –

+1

Ссылка на сообщение в блоге в ответ мертва. – Pang

7

Не используйте int !!! Я скопировал этот код и теперь имею ошибку в своем приложении. Некоторые часовые пояса являются .5 ч

использовать это:

float offset = [timezone secondsFromGMTForDate:self.date]/3600.0; 

и не забывайте .0 за 3600

15

Для тех, кто ищет для смещения текущего часового пояса в виде строки, попробуйте:

NSDateFormatter *localTimeZoneFormatter = [NSDateFormatter new]; 
localTimeZoneFormatter.timeZone = [NSTimeZone localTimeZone]; 
localTimeZoneFormatter.dateFormat = @"Z"; 
NSString *localTimeZoneOffset = [localTimeZoneFormatter stringFromDate:[NSDate date]]; 

В моей временной зоне, localTimeZoneOffset содержит -0700

+2

Спасибо. Сохранял мои часы. –

1
-(void)getDeviceUTCOffset{ 

    NSDate *date = [NSDate date]; 
    NSTimeZone* deviceTimeZone_ = [NSTimeZone systemTimeZone]; 
    float offset = [deviceTimeZone_ secondsFromGMTForDate:date]/3600.0; 
} 

Чтобы проверить код - тест на устройстве

изменить устройство Timezone в

Settings > General > Date Time 
Turn off SET AUTOMATICALLY 
Then tap TimeZone and choose major cities east/west of you 
Run code and check float offset 

Сравнить значение города на этом сайте

например Heres Хельсинки

Стандартный часовой пояс: UTC/GMT +2 час - по состоянию на ноябрь

http://www.timeanddate.com/worldclock/city.html?n=101

Проверка против стран с британской Summer Time или их эквивалент.

3

Используйте NSTimeZone в localTimeZon е

NSTimeZone *timeZone = [NSTimeZone localTimeZone]; 
NSInteger seconds = [timeZone secondsFromGMT]; 
NSLog(@"TZ : %@ : Seconds %ld",[timeZone abbreviation],(long)seconds); 

int h = (int)seconds/3600; 
int m = (int)seconds/60 % 60; 

NSString *strGMT = @""; 
if (h>=0) 
    strGMT = [NSString stringWithFormat:@"+%02d:%02d", h, m]; 
else 
    strGMT = [NSString stringWithFormat:@"%03d:%02d", h, m]; 

NSLog(@"GMT -/+ HH:mm: %@",strGMT); 
+0

Приведенный выше код не дает правильных значений для отрицательных секундFromGMT и отличных от нуля минут. Я бы предложил заменить условие 'if (0 <= seconds)' и 'else' с помощью' strGMT = [NSString stringWithFormat: @ "-% 02d:% 02d", -h, -m]; ' –

0

Вот простой способ сделать это в Swift 3:

let offsetInHours = Double(TimeZone.current.secondsFromGMT())/3600.0

Смежные вопросы