您的位置:首页 > 移动开发 > Android开发

Android 系列 2.11使用Java 8 java.time API简化日期/时间计算

2017-01-06 10:33 721 查看
2.11使用Java 8 java.time API简化日期/时间计算

问题

你听说过,包含在Java SE 8中的JSR-310日期/时间API简化了日期和时间计算,并且希望在Android中使用它。



因为即使在Android Nougat中,Android也没有完全符合JDK8的Java标准,尽管是“基于”OpenJDK 8,你必须使用第三方库,如JSR-310“backport”来访问java.time设施,虽然使用不同的包名称。

讨论

java.time API有很长的历史,我不会在这里介绍你;足以说我们都感谢史蒂文·科尔本发明它,并且他坚持敦促首先Sun,然后是Oracle,将它并入Java,最终发生在Java 8.出于许可的原因,JSR的“后端” 310 - 由其原始作者 - 到Java 6/7被放置在非Java包org.threeten.bp由于Android不提供与Java 8的完全兼容性,我们使用外部库。虽然可以使用Android上的原始反向端口以及标准Java,我们将使用Android-speicifc版本,它使用更有效的机制来加载时区信息。这个版本,由Jake
Wharton,在GitHub上提供,网址为https://github.com/JakeWharton/ThreeTenABP。更有趣的是,它可以添加到任何Gradle或Maven项目只是通过添加坐标compile'c​​om.jakewharton.threetenabp:threetenabp:1.0.3'到你的构建脚本(版本号可能会随时间的变化)。
这里是一个例子,显示了内置计算类型的复杂程度;该示例显示需要多少代码来确定下一个每周和每月付款日所在的月份中的哪一天。

LocalDateTime now = LocalDateTime.now();
LocalDateTime weeklyPayDay =
now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
weekly.setText("Weekly employees' payday is Friday " +
weeklyPayDay.getMonth() + " " +
weeklyPayDay.getDayOfMonth());
LocalDateTime monthlyPayDay =
now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY));
monthly.setText("Monthly employees are paid on " +
monthlyPayDay.getMonth() + " " +
monthlyPayDay.getDayOfMonth());
API包括LocalDate对象,它只表示一天的时间,LocalTime只是一个时间,LocalDateTime表示日期和时间。

这三个都是,就像名字所暗示的,本地的,不意味着代表时间跨世界的时区。 为此,您要使用表示时区的几个类之一。 有关所有类的详细信息,请参见https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html。

要在Android上使用此功能,您需要一次调用来初始化它,无论是在Application类(参见配方2.3)或您的活动。 在主活动的oncreate方法中,你会说:

AndroidThreeTen.init(getApplication());

结果应如图2-4所示:

图2-4。 Java时间示例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息