关于 `为啥在 Android 中使用 net.danlew:android.joda 而不直接使用 joda-time:joda-time 的问题:
如果你在 Android 使用 android.joda,你必须要在 Application.onCreate()中初始化 JodaAndroid,像这样:
public class AppController extends Application {
@
Override public void onCreate() {
super.onCreate();
JodaTimeAndroid.init(this);
}
}
不初始化,不会报错,但是这样就没有任何优势。
这个就写在 joda-android 的 Readme 中,
!!!!!但是全文没有任何地方说明这个问题!!!!!
为什么这里要初始化?
1. Joda-Time 需要时区的配置(使用 Provider 接口实现),而时区标准是在不断变更和扩充的,经常性更新。
原版 joda 把它设计为资源数据库,放到 classpath 中加载,joda-android 将其改为 android-resources,对 andorid 更友好。
joda-android 引用的 joda 为 :joda-time-xxx-no-tzdb,这里不包含时区资源配置。
初始化这句,就是替换默认的 Provider:
```
DateTimeZone.setProvider(new ResourceZoneInfoProvider(context));
```
这里你不初始化,会走一个默认的。提供的外置时区资源根本不会加载。
2. Android 手机是可以调时间修改时区的,如果你动态改了时区,joda 的默认时区就不同了,因此需要注册一个 BroadcastReceiver 监听时区变化,来动态修改默认时区。
================================================================
Android Studio 2.4 已经开始支持 Java 8 了,但是却没有 java.time 包,这个不是 BUG!!
虽然开发需要安装 JDK,但是 java-se 环境跟 Android 环境,使用的核心库跟标准库并不是一个。
你可以理解为,他们只是使用了相同的接口签名,Android 用的并不是 Java 的核心库。(这就是为啥甲骨文跟谷歌撕逼了好几年) Andorid 的核心库实现在这里:
%ANDROID_HOME%\sources\android-25
因此,没有 java.time 包,不是 BUG,单纯是因为这部分包谷歌没有移植!!如果你仔细看,很多核心库的实现都是不一样的!
================================================================
最后,
文章的标题叫做《 Android ( Java )日期和时间处理完全解析——使用 Gson 和 Joda-Time 优雅地处理日常开发中关于时间处理的问题》
读完后,没看到完全解析,也没看到优雅,同时提到的 gson 和 joda 也没结合