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'com.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时间示例
问题
你听说过,包含在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'com.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时间示例
相关文章推荐
- Java 8系列(一): 日期/时间- JSR310( Date and Time API)
- LocalDate LocalTime LocalDateTime DateTimeFormatter Java 8 新出的时间(time)和日期(date)的API的使用详细实例
- Android 使用DatePicker以及TimePicker显示当前日期和时间
- Java8 日期/时间(Date Time)API指南
- Java入门学习-学会使用日期函数和日期的计算方法,理解什么是时间戳
- Java 8 新特性:Java 类库的新特性之日期时间API (Date/Time API )
- C/C++日期时间使用方法,struct tm, time_t, clock_t,计算循环所用时间
- Java 8 新特性:Java 类库的新特性之日期时间API (Date/Time API )
- Java8学习笔记(九)--日期/时间(Date Time)API指南
- Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
- Java 8中对日期和时间的处理(使用API处理)
- Java 8 日期/时间(Date Time)API指南
- Java8新日期时间API的20个使用示例
- Java8新日期时间API的20个使用示例
- 解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
- Java8 日期/时间(Date Time)API指南
- Android——使用DatePicker和TimePicker显示当前日期和时间
- 【转】JAVA 8 日期/时间(Date Time)API指南
- Android实用笔记——使用DataPicker和TimePicker显示当前日期和时间
- C/C++日期时间使用方法,struct tm, time_t, clock_t,计算循环所用时间