内容简介:Java8新特性java.time.*包学习。 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、10、11相继出来,长江后浪推前浪一浪胜过一浪。之前date的使用还不敢自信说多透彻,后续都是泪...(欢迎酱油...)以jdk1.8.0_111为例jdk1.8包目录简介:
Java8新特性java.time.*包学习。 自从 java 发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、10、11相继出来,长江后浪推前浪一浪胜过一浪。之前date的使用还不敢自信说多透彻,后续都是泪...(欢迎酱油...)
以jdk1.8.0_111为例
新的设计思路
- 引入final定义支持时间点不可变和线程安全,长久来的Date的设计一直遭人诟病着;
- 设计LocalDate、LocalDateTime、LocalTime、instant、Clock、Duration等类,format\zoo\temporal等包规范时间的定义划分;
- 时间统一使用 ISO-8601 日历系统,也就是
yyyy-MM-dd'T'HH:mm:ss:SSSZZ格式,输出2012-04-13T10:53:43:119+08:00样子,要是用过 jota-time 包估计你什么都懂了; - 规范并提供更加好用的时间操作方法,plus\minus\with\to\get\of\now等方法命名规则;
jdk1.8包目录简介:
- time:父级基础包,常用的时间相关类都在这里,如LocalDate\LocalDateTime\Instant等
- chrono:日历系统包,日历相关的接口(类似Calendar)也包括提供对其他日历系统的API
- format:格式化和解析包,主要类是DateTimeFormatter
- temporal:扩展功能包,提供细粒度的时间控制field、unit,如weeks、months、month-of-year等
- zone:时区包,时区规则、本地时区等
围绕常用点和大多数人经常用到做些用例
计算、格式化、字符串转换这三快可以说是很基础的功能,大多数人主要围绕这几块进行开发和封装,基础掌握后面的高级用法慢慢就可以积累。一般使用都是围绕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
时间对象和string相互转换
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
新API和就Date转换策略
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- React 新特性总结
- HTML5新特性总结
- MQTT v5.0新特性总结(非规范)
- C++11 新特性总结(相比 C++98)
- ES6、7、8常用新特性总结(超实用)
- es6、7、8、9新语法新特性-总结
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript Patterns
Stoyan Stefanov / O'Reilly Media, Inc. / 2010-09-21 / USD 29.99
What's the best approach for developing an application with JavaScript? This book helps you answer that question with numerous JavaScript coding patterns and best practices. If you're an experienced d......一起来看看 《JavaScript Patterns》 这本书的介绍吧!