java8新特性教程之time包使用总结
作者:Owen 发布时间:2023-02-08 03:58:19
前言
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包目录简介:
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🇲🇲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
来源:https://blog.shareworld.vip/article/java8time01


猜你喜欢
- 为什么写?今天去上班的公交上,有朋友在张队(张善友)的微信群里,发了一个介绍C# 6.0新特性的视频,视频7分钟,加上本人英语实在太low,
- SpringBoot接收文件和对象使用场景:某个接口,需要同时接收文件和实体,也就是参数一、这个时候,前端就不能json格式传送数据了,要用
- 前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。在Java Code Geeks上已经有很多介绍
- 需求:Android调用webView加载网页的时候,拦截某一个链接不执行此链接,执行指定跳转到其他activity页面。webview的s
- 本文实例为大家分享了WheelView实现上下滑动选择器的具体代码,供大家参考,具体内容如下1.获得wheelwheel是GitHub上的一
- 本文实例展示了C#自定义函数NetxtString实现生成随机字符串的方法,在进行C#项目开发中非常实用!分享给大家供大家参考。一、生成随机
- 内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁千里之堤的蚁穴。 怎么才能检测内存泄露呢? AndroidSt
- 前言一大早还在北京拥挤的地铁里,我的CTO闫哥在微信里给我发了一条信息:Android Studio 3.0发布了。为什么会这么关注Andr
- 企业级项目开发中都会有文件、图片、视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上;对于传统项目可能会单独搭建
- 我们知道,使用nginx作为文件下载服务器,可以极大地降低对后端Java服务器的负载冲击,但是nginx本身并不提供授权控制,因此好的方案是
- springboot 取消starter的自动注入starer是spring boot中一个很重要的概念,starter相当于一个模块,它能
- 本文实例为大家分享了C#类的多态性,供大家参考,具体内容如下第一种:编译时的多态性,直接这样说不知道说啥?程序执行过程主要分为三步:编译,链
- 一、为什么要学习并发编程对于 “我们为什么要学习并发编程?” 这个问题,就好比 “我们为什么要学习政治?” 一样,我们(至少作为学生党是这样
- macOS搭建Spring Boot开发环境,具体内容如下软硬件环境macOS Sierrajava 1.8.0_65maven 3.5.0
- 本文实例讲述了Java 反射机制原理与用法。分享给大家供大家参考,具体如下:反射反射,程序员的快乐!1、什么是反射?Java反射就是在运行状
- 先看看效果图:开源项地址:https://github.com/chrisbanes/Android-PullToRefresh
- IntelliJ IDEA 安装后需要进行初始化配置已更加方便使用。本文整理了比较通用的安装后初始配置。本文的版本:IntelliJ IDE
- 项目介绍springboot搭建的访客管理系统,针对高端基地做严格把控来访人员信息管理,用户后端可以设置多个管理员帐号,给予不同部门的管理层
- LeetCode -- Path Sum III分析及实现方法题目描述:You are given a binary tree in whi
- 引言Spring Boot的一个便捷功能是外部化配置,可以轻松访问属性文件中定义的属性。本文将详细介绍@ConfigurationPrope