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

时间:2015-01-07 11:02:05

标签: ios objective-c datetime timezone nstimezone

我想在运行时更新iOS应用的时区。我想在用户更改“设置”应用“设置 - >常规 - >语言& 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区域(systemtimezone)中设置的时区?

当我们更新区域时,它会更新设备的区域设置(AM / PM或24HOUR格式)。我们可以使用[NSLocale autoupdatingCurrentLocale]在应用程序中获取此更新的语言环境,但我们需要从导航控制器弹出视图控制器并再次为新语言环境推送它。我想更新这种新的时间格式而不会从导航控制器弹出视图控制器?

1 个答案:

答案 0 :(得分:4)

如果区域设置发生更改并且您想更新UI以反映当前区域设置(对于AM / PM与24小时时间格式之类的内容),您只需要监听区域设置更改,然后询问NSDateFormatter对于您正在使用的任何字符串的新值。首先,观察NSCurrentLocaleDidChangeNotification。当您收到该通知时,请向NSDateFormatter询问新的字符串值,并在您的界面中使用这些字符串,再次致电stringForDate:

如果日期/时间字符串在表视图中,这可能意味着重新加载表视图。如果它们位于其他UI元素中,则取决于您首先如何配置该元素。日期格式化程序将自动提供当前值 - 无需使用autoupdatingCurrentLocale

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