java time_java8新特性教程之time包使用总结

前言

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🇲🇲ss:SSSZZ格式,输出2012-04-13T10:53:43:119+08:00样子,要是用过jota-time包估计你什么都懂了;

规范并提供更加好用的时间操作方法,plus\minus\with\to\get\of\now等方法命名规则;

jdk1.8包目录简介:

8a92410c163a98624a156ebdeb2c161d.png

time:父级基础包,常用的时间相关类都在这里,如LocalDate\LocalDateTime\Instant等

chrono:日历系统包,日历相关的接口(类似Calendar)也包括提供对其他日历系统的API

format:格式化和解析包,主要类是DateTimeFormatter

temporal:扩展功能包,提供细粒度的时间控制field、unit,如weeks、months、month-of-year等

zone:时区包,时区规则、本地时区等

a5f6bb05d0b3be8fb9446311ec5c35c8.png

7efa2de7032b12e33ab705f901e34275.png

67d3b74c9d8cc729d974404185e25e98.png

f989e24aacf0b5b1f46454fa43c9c7eb.png

围绕常用点和大多数人经常用到做些用例

计算、格式化、字符串转换这三快可以说是很基础的功能,大多数人主要围绕这几块进行开发和封装,基础掌握后面的高级用法慢慢就可以积累。一般使用都是围绕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

网上找的新旧类的比较图挺好的,贴在这里:

816d78ad929b321820208f0410ac708b.png

时间加减计算

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🇲🇲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🇲🇲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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值