ZonedDateTime.now() 导致 org.threeten.bp.zone.ZoneRulesException

ZonedDateTime.now() causes org.threeten.bp.zone.ZoneRulesException

提问人:logi0517 提问时间:10/12/2016 最后编辑:Tomlogi0517 更新时间:10/12/2016 访问量:1798

问:

我刚刚发现这个库可以在 Android 上使用 Java 8 中的 java.time。在我的 TimePickerDialog 中,我请求一个时间,然后我必须以以下格式向带有 Date 对象(带有对话框中的时间)的服务器发送一个 HTTP 请求: 我开始尝试使用常用的类(Calendar、Date、SimpleDateFormat),但过了一会儿我放弃了,寻找了一个更干净的解决方案,并找到了 ZonedDateTime 类来自 Java 8。它看起来正是我想使用的类,但是当我尝试使用 ZonedDateTime.now() 创建它的实例时,我得到以下堆栈跟踪:"YYYY-MM-DDTHH:MM:SS+HH:MM"

org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered
  at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:176)
  at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:133)
  at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
  at org.threeten.bp.ZoneId.of(ZoneId.java:357)
  at org.threeten.bp.ZoneId.of(ZoneId.java:285)
  at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:244)
  at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137)
  at org.threeten.bp.ZonedDateTime.now(ZonedDateTime.java:168)
  at eu.arrowhead.arrowheaddemo.ReservationsActivity.onTimeSet(ReservationsActivity.java:162)
  at eu.arrowhead.arrowheaddemo.TimePickerFragment.onTimeSet(TimePickerFragment.java:56)
  at android.app.TimePickerDialog.onClick(TimePickerDialog.java:141)
  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:164)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:154)
  at android.app.ActivityThread.main(ActivityThread.java:6077)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我按照我的应用程序类(在 onCreate 中)中的文档进行了操作,所以我不知道是什么原因导致了这个问题。AndroidThreeTen.init(this);

奖励问题:一旦我让它工作并且我有了我想在 ZonedDateTime 对象中发送的日期,我如何将其转换为简单的?提前非常感谢你。java.util.Date

编辑:初始化证明:

public class MyApplication extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        AndroidThreeTen.init(this);
    }
}

顺便说一句,API 级别为 24。

android 日期 java-time threetenbp

评论

0赞 Opiatefuchs 10/12/2016
你能显示你的 gradle 文件吗?
0赞 logi0517 10/12/2016
编译“com.jakewharton.threetenabp:threetenabp:1.0.4”在依赖项中
0赞 Opiatefuchs 10/12/2016
你能展示你设置 AndroidThreeTen.init() 的部分吗?
0赞 Basil Bourque 10/13/2016
切线:通常最好以 UTC 而不是时区交换数据。用于生成标准 ISO 8601 格式的字符串。并且不要将日期时间对象与它们为表示其内部值而生成的字符串混淆。使用 HTTP 请求时,您发送/接收的是文本,而不是对象。您需要将收到的文本解析为 date-time 对象,并且对于发送,您需要 date-time 对象生成一个 String。这些字符串是不同的和分开的。字符串有格式,对象没有Instant.toString()
2赞 logi0517 10/22/2016
对于到达此处的任何人:在 AndroidManifest 的应用标记中使用此代码:android:name=”。我的应用程序”

答: 暂无答案