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

Java里time包的功能,java8新特性之time包总结相关推荐

  1. Java里time包的功能,java8新特性教程之time包使用总结

    前言 java8新特性java.time.*包学习. 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9.10.11相继出来,长江后浪推前浪一浪胜过一浪.之前dat ...

  2. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  3. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

  4. 【JAVA拾遗】Java8新特性合辑

    [JAVA拾遗]Java8新特性合辑 文章目录 [JAVA拾遗]Java8新特性合辑 0. 逼逼 [--/--]126 Lambda Expressions & Virtual Extensi ...

  5. 【JAVA基础】java基础之-java8新特性

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

  6. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  7. Java基础之Java8 新特性

    hp实训8.19_Java基础之Java8新特性 // 信息展示方法 ,接口中,就可以提供一种实现. 就可以使用这种功能.default void print() {System.out.printl ...

  8. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  9. java stream byte_乐字节-Java8新特性之Stream流(上)

    上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...

最新文章

  1. Tomcat 1099端口占用重启无效,查不到进程,改换端口无效解决方案
  2. Android系统默认Home应用程序(Launcher)的启动过程源码分析
  3. Ubuntu下pip3的安装、升级、卸载
  4. pandas常见错误类型TypeError: bad operand type for unary ~: 'float'
  5. Microsoft SignalR Map Controller具有页面可见性API和事件模糊功能,可映射文档管理系统(DMS)中的用户交互
  6. typescript的基本类型
  7. springboot整合dubbo注解方式(三)
  8. 超高频手持机怎样选择才适合工作呢
  9. NodeMCU(ESP8266)按键中断实现单击-双击-长按功能
  10. QT/Embedded 2.3.8 MX21ADS板移植
  11. ERStudio 安装
  12. 消息队列实现原理(以kafka为例)
  13. vue创建项目自定义配置
  14. Google Earth Engine(GEE)基于哨兵数据计算植被覆盖度—以宁夏为例
  15. 联想用u盘重装系统步骤_联想电脑怎样重新安装系统方法步骤详细教程 - 系统家园...
  16. marshmallow——快速入门
  17. TCGA数据库ensembl id 转为 gene Symbol,提取出需要的RNA种类表达谱列表信息
  18. win7查看隐藏文件夹
  19. 女巫小屋的指令Java_我的世界女巫小屋详介绍 我的世界女巫小屋种子代码一览...
  20. 中国App增长联盟,和优秀的创始人玩着办大事!

热门文章

  1. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS
  2. 架构师接龙:金山张宴VS.淘宝岑文初
  3. 实现部分库函数(strlen、strcpy、strcmp、strcat、strstr...)
  4. 狭义云计算和广义云计算_什么是云计算? 您现在需要知道的一切
  5. 伺服电机矢量控制原理与仿真(1)控制系统的建立
  6. 神笔马良——读《餐巾纸的背面》
  7. 三个整数和与积中位数c语言,湖北省宜昌市枝江市届中考数学3月模拟试卷.pdf
  8. 满多少算积分 java_海量用户积分排名算法探讨
  9. max pooling
  10. 微服务--Docker详解