Java8新特性java.time.*包学习。 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、10、11相继出来,长江后浪推前浪一浪胜过一浪。之前date的使用还不敢自信说多透彻,后续都是泪...(欢迎酱油...)
以jdk1.8.0_111为例
yyyy-MM-dd'T'HH:mm:ss:SSSZZ
格式,输出 2012-04-13T10:53:43:119+08:00
样子,要是用过 jota-time 包估计你什么都懂了; jdk1.8包目录简介:
计算、格式化、字符串转换这三快可以说是很基础的功能,大多数人主要围绕这几块进行开发和封装,基础掌握后面的高级用法慢慢就可以积累。一般使用都是围绕time基础包中LocalDate/LocalDateTime/LocalTime类展开,先介绍一下这几个类及相关的类。
LocalDate: 一个ISO-8601日历系统下的data对象,如 2007-12-03
LocalDateTime: 一个ISO-8601日历系统下的data-time对象,如 2007-12-03T10:15:30
LocalTime: 一个ISO-8601日历系统下的time对象,如 10:15:30
Instant: 一个瞬时的时间点值对象,从 1970-01-01T00:00:00Z
点毫秒计算的 Clock: 基于instant生成的时钟对象,遵守UTC时区规则可以去生成date和time Duration: 一个time范围值对象,单位也可以是分钟或小时 Period: 一个date范围值对象,单位可以是年、月、日,和duration正好是两个粒度对象 OffsetDateTime: 从UTC/Greenwich格式时间偏移成ISO-8601的date-time对象,如 2007-12-03T10:15:30+01:00
OffSetTime: 和OffsetDateTime类似,粒度是到time的UTC时间格式对象,如 10:15:30+01:00
ZonedDateTime: 带时区的ISO-8601日历系统的date-time对象,如 2007-12-03T10:15:30+01:00 Europe/Paris
ZonedOffset: 一个带时区的从Greenwich/UTC的偏移量范围中对象,如 +02:00
网上找的新旧类的比较图挺好的,贴在这里:
LocalDateTime dateTime = LocalDateTime.now(Clock.system(ZoneId.systemDefault())); LocalDateTime datetime2 =dateTime.minusDays(2); printTest(dateTime); printTest(datetime2); printTest(datetime2.plusHours(3)); printTest(datetime2.minusWeeks(1)); printTest(datetime2.plus(1,ChronoUnit.MONTHS)); printTest(datetime2.compareTo(dateTime)); printTest(datetime2.withYear(2)); printTest(datetime2.isBefore(dateTime)); Duration duration = Duration.ofDays(5); printTest(duration); printTest(duration.plusHours(2).toMinutes());
结果:
1 : 2019-01-29 11:01:49 2 : 2019-01-27 11:01:49 3 : 2019-01-27 14:01:49 4 : 2019-01-20 11:01:49 5 : 2019-02-27 11:01:49 6 : -2 7 : 0002-01-27 11:01:49 8 : true 9 : PT120H 10 : 7320
LocalDateTime dateTime = LocalDateTime.now(Clock.systemDefaultZone()); printTest(dateTime); printTest(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); printTest(dateTime.format(DateTimeFormatter.ISO_WEEK_DATE)); printTest(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); builder.appendPattern("yyyy-MM-dd"); builder.parseStrict().toFormatter(); printTest(dateTime.format(builder.parseStrict().toFormatter()));
结果:
1 : 2019-01-29 11:14:07 2 : 20190129 3 : 2019-01-29T11:14:07.232 4 : 2019-W05-2 5 : 2019-01-29 11:14:07.232 6 : 2019-01-29
LocalDateTime dateTime = LocalDateTime.now(Clock.system(ZoneId.systemDefault())); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); printTest(dateTime.format(DateTimeFormatter.ISO_LOCAL_TIME)); printTest(dateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); printTest(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM))); printTest(dateTime.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.valueOf("MEDIUM")))); printTest(LocalDateTime.parse("2019-12-03T10:15:30").toString()); printTest(LocalDate.parse("2019-12-03",DateTimeFormatter.ISO_LOCAL_DATE)); printTest(LocalTime.parse("10:15:30",DateTimeFormatter.ISO_LOCAL_TIME));
结果:
1 : 2019-01-29 2 : 2019-01-29T10:35:38.508 3 : 10:35:38.508 4 : 20190129 5 : 2019-01-29 10:35:38 6 : 19-1-29 上午10:35 7 : 2019-1-29 10:35:38 8 : 2019-1-29 10:35:38 9 : 2019-12-03T10:15:30 10 : 2019-12-03 11 : 10:15:30
LocalDateTime localDateTime = LocalDateTime.now(); localDateTime.minusHours(2); printTest(localDateTime); Date localDateTime2 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); printTest(localDateTime2.toString()); LocalDate localDate = LocalDate.now(); printTest(localDate); Date localDate2 = Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); printTest(localDate2); Date date = new Date(); printTest(date); LocalDateTime date2 = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault()); printTest(date2); LocalTime localTime = LocalDateTime.ofInstant(new Date().toInstant(),ZoneId.systemDefault()).toLocalTime(); printTest(localTime);
结果:
1 : 2019-01-29 13:06:58 2 : Tue Jan 29 13:06:58 CST 2019 3 : 2019-01-29 4 : Tue Jan 29 00:00:00 CST 2019 5 : Tue Jan 29 13:06:58 CST 2019 6 : 2019-01-29 13:06:58 7 : 13:06:58.343
不要听信那些“网上找找文档看看就能掌握”的鬼话,过来人都明白知识体系的分量有多重要。自己找的资料是非常零碎的,同时需要你很强大的知识构建能力去把这些都串起来。很不幸,这样的能力绝大多数人都不具备。
每一本技术书的完成都不是一朝一夕随随便便就写出来的,作者用心良苦的在思考如何帮助你去理解。写书和技术能力有时不一定成正比,但逻辑思维能力应该不弱。反正写技术书的人在我心里都是神一般的存在,虽然垃圾书比较多但不影响我对他们的仰慕。
常用java处理时间包: joda-time
java8-api文档: jdk8-doc
作者:Owen Jia
推荐关注博客:Owen Blog
知识的海洋里,当奋起直追,芳不负年华
本文由 Owen Jia 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2019/01/29 14:13