Обновите часовой пояс приложения iOS во время его работы

Я хочу обновить часовой пояс моего приложения iOS во время его работы. Я хочу обновить часовой пояс, когда пользователь меняет регион из приложения «Настройки» «Настройки-> Общие-> Язык и регион-> Регион».

Я получаю уведомление об изменении региона, используя NSCurrentLocaleDidChangeNotification, и вызывается метод селектора «updateTimeZone».

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTimeZone) name:NSCurrentLocaleDidChangeNotification object:nil];

- (void)updateTimeZone
{
    NSLog(@"Zone1: %@", [NSTimeZone systemTimeZone]);
    NSLog(@"Zone2: %@", [NSTimeZone localTimeZone]);
    NSLog(@"Zone3: %@", [NSTimeZone defaultTimeZone]);
    [NSTimeZone resetSystemTimeZone];
    NSLog(@"Zone11: %@", [NSTimeZone systemTimeZone]);
    NSLog(@"Zone22: %@", [NSTimeZone localTimeZone]);
    NSLog(@"Zone33: %@", [NSTimeZone defaultTimeZone]);
}

Вывод

2015-01-07 16:23:02.992 A[1677:105206] Zone1: Asia/Kolkata (GMT+5:30) offset 19800
2015-01-07 16:23:02.993 A[1677:105206] Zone2: Local Time Zone (Asia/Kolkata (GMT+5:30) offset 19800)
2015-01-07 16:23:02.994 A[1677:105206] Zone3: Asia/Kolkata (GMT+5:30) offset 19800
2015-01-07 16:23:02.999 A[1677:105206] Zone11: Asia/Kolkata (GMT+5:30) offset 19800
2015-01-07 16:23:02.999 A[1677:105206] Zone22: Local Time Zone (Asia/Kolkata (GMT+5:30) offset 19800)
2015-01-07 16:23:03.001 A[1677:105206] Zone33: Asia/Kolkata (GMT+5:30) offset 19800

Я пытался изменить многие регионы в настройках, но мое приложение всегда показывает мой текущий часовой пояс. Я уже использую [NSTimeZone resetSystemTimeZone]; чтобы удалить кешированный часовой пояс, но всегда получать мой текущий часовой пояс. Как я могу получить часовой пояс, установленный в регионе iOS (системный часовой пояс)?

Когда мы обновляем регион, он обновляет локаль (формат AM/PM или 24HOUR) для устройства. Мы можем получить эту обновленную локаль в приложении, используя [NSLocale autoupdatingCurrentLocale], но нам нужно вытолкнуть контроллер представления из контроллера навигации и снова нажать его для новой локали. Я хочу обновить этот новый формат времени, не выскакивая из контроллера представления из контроллера навигации?


person Saurabh Shukla    schedule 07.01.2015    source источник
comment
Где именно вы делаете это изменение в настройках iOS?   -  person Tom Harrington    schedule 07.01.2015
comment
Я хочу обновить формат AM/PM до 24-часового (военного) формата или наоборот.   -  person Saurabh Shukla    schedule 08.01.2015
comment
Но формат AM/PM по сравнению с 24-часовым форматом не является частью часового пояса.   -  person Tom Harrington    schedule 08.01.2015
comment
@TomHarrington Добавлено больше деталей.   -  person Saurabh Shukla    schedule 09.01.2015


Ответы (1)


Если локаль меняется, и вы хотите обновить пользовательский интерфейс, чтобы отразить текущую локаль (для таких вещей, как форматы времени AM/PM против 24-часового формата), вам просто нужно прослушать изменения локали, а затем запросить у NSDateFormatter новые значения любых строк, которые вы пользуетесь. Во-первых, обратите внимание на NSCurrentLocaleDidChangeNotification. Когда вы получите это уведомление, запросите у NSDateFormatter новые строковые значения и используйте эти строки в своем пользовательском интерфейсе, снова вызвав stringForDate:.

Если строки даты/времени находятся в табличном представлении, это, вероятно, означает перезагрузку табличного представления. Если они находятся в каком-то другом элементе пользовательского интерфейса, это зависит от того, как вы изначально настроили этот элемент. Средство форматирования даты автоматически выдаст текущие значения - не нужно возиться с autoupdatingCurrentLocale.

Ничто из этого не имеет ничего общего с часовыми поясами. Обычно часовой пояс iPhone обновляется автоматически, если телефон перемещается в новый часовой пояс. Но пользовательские настройки (например, форматы даты) не меняются, когда это происходит. Эти настройки привязаны к языковому стандарту пользователя и остаются неизменными независимо от часового пояса.

person Tom Harrington    schedule 09.01.2015
comment
Это хороший ответ для различения локали и часового пояса. Часовой пояс определяется политикой и географией. Языковой стандарт определяется культурой и конкретным пользователем. - person Tommy; 10.01.2015
comment
Спасибо @ Том Харринтон. Хорошо объяснил +1 и принял. - person Saurabh Shukla; 10.01.2015