1.不变性
新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处。
比如:LocalDateTime
2.关注点分离
新的API将人可读的日期时间和机器时间(unix timestamp)明确分离,它为日期(Date)、时间(Time)、日期时间(DateTime)、时间戳(unix timestamp)以及时区定义了不同的类。
不同时间分解成了各个类,比如:LocalDate, LocalTime, LocalDateTime, Instant,Year,Month,YearMonth,MonthDay,DayOfWeek等,满足各种不同场景使用需求。
3.清晰
在所有的类中,方法都被明确定义用以完成相同的行为。
举个例子,要拿到当前实例我们可以使用now()方法,在所有的类中都定义了format()和parse()方法,而不是像以前那样专门有一个独立的类。方法明确,清晰,统一,方便好记。
4.实用操作
(相当于很多工具方法,不再需要我们自己封装了):所有新的日期/时间API类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期/时间中提取单独部分,等等。
比如:LocalDateTime,包含非常丰富的实用操作(转换,获取各个字段,修改字段,增加和减少等)。
5.TemporalAdjuster 让你能够用更精细的方式操纵日期
不再局限于一次只能改变它的 一个值,并且你还可按照需求定义自己的日期转换器。比如:将日期调整到下个周日、下个工作日,或者是本月的最后一天。
lastDayOfMonth 创建一个新的日期,它的值为当月的最后一天。
6.对比Jdk7及以前的日期时间类的缺点改进
6.1 Date和Calendar的不方便使用问题
(1)new Date(2019,01,01)
实际是3919年2月。因为Date的构造函数 的年份表示的始于1900年的差值。
LocalDate创建实例:
LocalDate localDate = LocalDate.of(2019, 1, 1);
(2)month是从0开始的。
LocalDate month是从1开始的:
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getMonthValue());
输出是1
(3)DAY_OF_WEEK 的取值,是从周日(1)开始的。
LocalDate week是从周一(1)开始的:
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getDayOfWeek());
System.out.println(localDate.getDayOfWeek().getValue());
输出
TUESDAY
2
(4)Date如果不格式化,打印出的日期可读性差。
LocalDate的输出,清晰。
LocalDate localDate = LocalDate.of(2019, 1, 1);
System.out.println(localDate.getMonthValue());
System.out.println(localDate.toString());
输出:
2019-01-01
(5)日期类并不提供国际化,没有时区支持
java8的时间类都支持了时区操作。
例如:LocalDateTime
//中国时间,输出时不包含时区
LocalDateTime ldt = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println(ldt);
//意大利罗马时间,输出时包含时区
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("Europe/Rome"));
System.out.println(zdt);
输出
2019-12-20T23:17:07.914
2019-12-20T16:17:07.915+01:00[Europe/Rome]
6.2 线程安全问题
(1)Date、Calendar可变性,线程安全问题
java8中所有类都是final修饰的,每次修改都会生成新的副本。
(2)DateFormat和SimpleDateFormat线程安全问题
java8中的DateTimeFormatter也是不可变的,源码:
6.3 java8对日期api进行系统的设计,增加了许多实用方便的操作,几乎不用再使用dateutil额外工具类。
比如,增加一天。
LocalDate localDate = LocalDate.of(2019, 1, 1);
LocalDate localDate2 = localDate.plusDays(1);
System.out.println("localDate:"+localDate);
System.out.println("localDate2:"+localDate2);
输出:
localDate:2019-01-01
localDate2:2019-01-02
参考:https://blog.csdn.net/wangsun300/article/details/103403490
Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点的更多相关文章
-
在swt中获取jar包中的文件 uri is not hierarchical
uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...
-
API接口自动化之3 同一个war包中多个接口做自动化测试
同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...
-
Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上 ...
-
Mac 如何导出ipa文件中Assets.car包中的切图
在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...
-
【转】Eclipse中查看jar包中的源码
(简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...
-
JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
-
Package.json中dependencies依赖包中^符号和~符号前缀的区别
刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在*上找到一个比 ...
-
Java8系列 (六) 新的日期和时间API
概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...
-
Java8 新的日期和时间API(笔记)
LocalDate LocalTime Instant duration以及Period 使用LocalDate和LocalTime //2017-03-20 LocalDate date = Loc ...
-
Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
随机推荐
-
《转载》Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...
-
python-网络编程-socket编程
一.TCP\IP(网络通信协议)简介 TCP:(Transmission Control Protocol)传输控制协议,面向有连接的通信协议 UDP:数据报文协议,面向无连接的通信协议 ...
-
js手机站跳转
var yunzhuanhua_pc_domain = "http://www.域名.com#yht"; //PC站网址var yunzhuanhua_wap_domain = & ...
-
[PCB设计] 3、用CAM350修改GERBER文件(删除某些部分)
1.问题产生 由于在电子元件封装时阻焊开窗未处理好,生成的GERBER文件在生产钢网时容易出现错误.比如:测试点上不需要上锡,如果封装元件时采用焊盘修改而来,结果往往使paste层在该测试点上有覆盖, ...
-
libevent linux安装
wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gzwget http://downloads.sourceforge.net/le ...
-
react组件通信那些事儿
父组件是调用组件的组件.现在看来,感觉父组件就是一个壳子,定义好壳子里面会有什么,而子组件是一个具体的实现,说明,会用到什么东西,如果有这些东西,会进行什么操作.总之,父组件是材料,有水和泥,子组件告 ...
-
[JSOI2016]*单词[动态规划、kmp]
题意 题目链接 分析 对于第一问,枚举最终串最小的相同前后缀来统计答案. 由于最小的相同前后缀也是*单词,所以可以考虑先求解子问题. 定义状态 \(f(i)\) 表示长度为 \(i\) 的串中有多少 ...
-
HTML —— 小记
标签语义化 所谓标签语义化是要使HTML标签具备很好的可读性,可以清晰传达每个标签所要表达的意义,以方便其被友好的处理和解析(主要针对网络爬虫) 好处: 1.对搜索引擎友好,增加排名权重 2.对用户友 ...
-
UOJ #79 一般图最大匹配 带花树
http://uoj.ac/problem/79 一般图和二分图的区别就是有奇环,带花树是在匈牙利算法的基础上对奇环进行缩点操作,复杂度似乎是O(mn)和匈牙利一样. 具体操作是一个一个点做类似匈牙利 ...
-
(6)进程---Event事件
# 阻塞事件 : e = Event()生成事件对象e e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False] e.wait(2) 传参 ...