我正在使用TimeZone.getDefault()
设置Calendar
类的时区:
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
Log.i("TEST", cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE));
但是,当用户从设置更改设备的时区时,“我的应用程序”表示在强制停止(从应用程序信息设置)并重新启动应用程序之前使用以前时区的时间。
如何防止缓存
getDefault()
? 最佳答案
这并不漂亮,但您可以潜在地调用setDefault(null)
来显式擦除缓存值。根据the documentation,这只会影响当前进程(即您的应用程序)。
将缓存值置空后,下次调用getDefault()
时,将重新构造该值:
/**
* Returns the user's preferred time zone. This may have been overridden for
* this process with {@link #setDefault}.
*
* <p>Since the user's time zone changes dynamically, avoid caching this
* value. Instead, use this method to look it up for each use.
*/
public static synchronized TimeZone getDefault() {
if (defaultTimeZone == null) {
TimezoneGetter tzGetter = TimezoneGetter.getInstance();
String zoneName = (tzGetter != null) ? tzGetter.getId() : null;
if (zoneName != null) {
zoneName = zoneName.trim();
}
if (zoneName == null || zoneName.isEmpty()) {
try {
// On the host, we can find the configured timezone here.
zoneName = IoUtils.readFileAsString("/etc/timezone");
} catch (IOException ex) {
// "vogar --mode device" can end up here.
// TODO: give libcore access to Android system properties and read "persist.sys.timezone".
zoneName = "GMT";
}
}
defaultTimeZone = TimeZone.getTimeZone(zoneName);
}
return (TimeZone) defaultTimeZone.clone();
}
您可能应该将其与
ACTION_TIMEZONE_CHANGED
的广播侦听器结合起来,并且只有在接收到这样的广播时才将默认值清空。编辑:想想看,一个更简洁的解决方案是从广播中提取新设置的时区。从广播文档:
时区-标识新时区的java.util.time zone.getid()值。
然后,您可以简单地使用此标识符更新缓存的默认值:
String tzId = ...
TimeZone.setDefault(TimeZone.getTimeZone(tzId));
随后对
getDefault()
的任何调用都将返回正确/更新的时区。