JodaTime不认识一些Android时区。

6

我在我的应用中使用JodaTime,并从开发者控制台获得有关崩溃的报告,例如:

java.lang.RuntimeException: Unable to resume activity {com.myapp.app/Home}: java.lang.IllegalArgumentException: The datetime zone id 'Africa/Abuja' is not recognised
....
Caused by: java.lang.IllegalArgumentException: The datetime zone id 'Africa/Abuja' is not recognised
at org.joda.time.DateTimeZone.forTimeZone(DateTimeZone.java:337)
...

我正在使用这行代码获取时区:
```html

我正在使用这行代码获取时区:

```
DateTimeZone tz = DateTimeZone.forTimeZone(TimeZone.getDefault());

有趣的是,大多数崩溃都发生在 Africa/**** 时区。

TimeZone.getDefault() 是 Android API 的一部分,因此我认为它会返回可用的时区 ID。

是否有什么方法可以正确使用这些时区?这是 Android 和 Joda Time 已知的问题吗?


1
我也遇到了“America/Toronto”的同样问题... 有解决方案吗? - jfcartier
@jfcartier 不是很需要。因为我只需要时区的毫秒数,所以我首先尝试使用 TimeZone.getDefault() 方法,将其传递给 DateTimeZone,如果它抛出异常,则默认使用 TimeZone.getDefault().getOffset() 方法。 - you786
2个回答

9
使用适用于Android的Joda版本:https://github.com/dlew/joda-time-android
然后,在您的应用程序的onCreate中运行JodaTimeAndroid.init(this);(它在其文档中),然后就可以轻松愉快地使用了,所有时区都将被识别。

如果我在网页应用程序上遇到了相同的问题,该怎么办?谢谢。 - Borgy Manotoy

1
区域“非洲/阿布贾”不是使用Olson标识符(以发明者Arthur David Olson命名)的IANA-tz-database中的有效时区标识符。相反,在这种情况下,有效的区域标识符是“Africa/Lagos”。
您还应该注意,JodaTime遵循IANA(也要在那里寻找最年轻的版本),而Android具有不同的自制tz数据库,可能使用不同的时区标识符。根据此android-api-link,Android支持Olson-tz-标识符。我不太确定为什么您完全使用“Africa/Abuja”,或者为什么这应该有效。它是否包含在TimeZone.getAvailableIDs()中?
如果Android配置中的任何奇怪事物导致TimeZone.getDefault()使用“Africa/Abuja”,则可以尝试将系统属性“user.timezone”设置为“Africa/Lagos”。 JodaTime首先会查看此属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接