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

标签 ios objective-c datetime timezone nstimezone

我想在运行时更新我的​​ iOS 应用程序的时区。我想在用户从“设置”应用程序“设置->常规->语言和区域->区域”更改区域时更新时区。

我正在使用 NSCurrentLocaleDidChangeNotification 接收区域更改通知,并且正在调用选择器方法“updateTimeZone”。

[[NSNotificationCenter defaultCenter] addObserver:self 选择器:@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] 在应用程序中获取此更新的区域设置,但我们需要从导航 Controller 中弹出 View Controller ,并再次推送它以获取新的区域设置。我想更新这个新的时间格式而不从导航 Controller 弹出 View Controller ?

最佳答案

如果区域设置发生变化,并且您想要更新 UI 以反射(reflect)当前区域设置(例如 AM/PM 与 24 小时时间格式),您只需监听区域设置更改,然后询问您的 NSDateFormatter 获取您正在使用的任何字符串的新值。首先,观察NSCurrentLocaleDidChangeNotification。当您收到该通知时,请向您的 NSDateFormatter 询问新的字符串值,并通过再次调用 stringForDate: 在您的 UI 中使用这些字符串。

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

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

关于ios - 在运行时更新 iOS 应用程序时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27817964/

相关文章:

ios - 如何从 PHAssetCollection 中删除图像?

PHP计算没有年份的两个日期之间的差异

sql - 在 PostgreSQL 中使用 EXCLUDE 防止相邻/重叠的条目

iphone - 交错的 iOS 动画

ios - 滚动时如何在表格 View 中插入表格 View 单元格?

iphone - 单击按钮时根据字母或数字顺序对 UITableView 进行排序

c# - DateTime.ParseExact 上的 CultureInfo?

ios - SIGABRT 与编辑表 - IOS

iphone - 如何在提交应用程序时添加附加信息

objective-c - 在 Objective-C 中放置花括号的惯例是什么?