JodaTime并不认识某些Android时区

时间:2014-03-19 07:34:35

标签: android timezone jodatime

我在我的应用程序中使用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)
...

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

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

有趣的是,大多数崩溃都是Africa/****

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

我能用这些时区做些什么来正确使用它们吗?这是Android和Joda Time的已知问题吗?

2 个答案:

答案 0 :(得分:8)

使用此适用于Android的Joda版本:https://github.com/dlew/joda-time-android

然后,在你的应用程序JodaTimeAndroid.init(this);中运行onCreate(它在他们的文档中),并且,正常工作,所有时区都被识别。

答案 1 :(得分:1)

区域“Africa / Abuja”不是使用Olson标识符(以发明人Arthur David Olson命名)在IANA-tz数据库中的有效时区标识符。相反,有效区域标识符在这种情况下是“非洲/拉各斯”。

您还应该注意到JodaTime遵循IANA(在那里寻找最年轻的版本),并且Android有一个不同的本土tz数据库,它可能使用不同的时区标识符。根据此android-api-link Android支持Olson-tz-identifiers。我不太清楚你为什么一直使用“非洲/阿布贾”。为什么这是有效的。它是否包含在TimeZone.getAvailableIDs()

如果Android配置中有任何异常导致TimeZone.getDefault()使用“Africa / Abuja”,那么您可以尝试将系统属性“user.timezone”设置为“Africa / Lagos”。 JodaTime将首先看看这家酒店。