在运行时更新 iOS 应用程序时区

Update iOS app timezone while it is running

我想在 iOS 应用程序运行时更新其时区。我想在用户从 "Settings" 应用 "Settings->General->Language & Region->Region".

更改区域时更新时区

我正在使用 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 或 24 小时格式)。我们可以使用 [NSLocale autoupdatingCurrentLocale] 在应用程序中获取这个更新的语言环境,但我们需要从导航控制器中弹出视图控制器并再次推送它以获取新的语言环境。我想更新这个新的时间格式而不从导航控制器弹出视图控制器?

如果语言环境发生变化并且您想更新 UI 以反映当前的语言环境(对于 AM/PM 与 24 小时时间格式之类的东西),您只需要监听语言环境变化和然后向您的 NSDateFormatter 询问您正在使用的任何字符串的新值。首先,观察NSCurrentLocaleDidChangeNotification。当您收到该通知时,通过再次调用 stringForDate: 向您的 NSDateFormatter 询问新的字符串值并在您的 UI 中使用这些字符串。

如果 date/time 字符串在 table 视图中,这可能意味着重新加载 table 视图。如果它们位于其他 UI 元素中,则取决于您最初是如何配置该元素的。日期格式化程序会自动给出当前值——不需要乱用 autoupdatingCurrentLocale.

None 其中与时区有关。通常,如果 phone 移至新时区,iPhone 时区会自动更新。但是当发生这种情况时,用户偏好(如日期格式)不会改变。这些首选项与用户的区域设置相关联,并且无论时区如何都保持不变。