Java 8 Date-Time API概览
更新时间:2018-04-19
根据网上资料整理
java 8增加了新的Date-Time API (JSR 310),增强对日期与时间的处理。它在很大程度上受到Joda-Time的影响。之前写过一篇关于Joda-Time的文章,还没写完,现在直接写这个java 8的新Date-Time API。
Date-Time API都在java.time
包下。
一、设计理念
Date-Time API使用如下几个设计理念开发而成。
清晰
API里的方法定义良好,它们的行为是明确可预测的。例如,调用一个Date-Time方法并传递一个null
参数必定会触发NullPointerException
异常。
流式
Date-Time API 提供一个流式接口,使代码更容易被阅读。因为大多数方法不允许null
参数,也不会返回null
,方法调用可以被连在一起,使代码更快被理解。例如:
LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
不可变
Date-Time API中的大多数类创建的对象都是不可变的,当它被创建后不能被修改。对不可变对象进行的一些操作会返回一个新对象。这意味这Date-Time API是线程安全的。例如,创建一个date或者time对象使用of
, from
, 或者 with
前缀,而不是一个构造器,并且也没有set
方法。
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);
可扩展
Date-Time API可以是可扩展的。你可以定义你自己的时间调节器和查询,或者构建你自己的calendar 系统。
二、概览
java.time
包里有许多可以代表时间和日期的类。这是一个非常丰富的API。下面列出几个关键的类:
Instant
类,提供了一个机器视角的时间线。LocalDate
,LocalTime
和LocalDateTime
类提供了人类视角的日期和时间,不涉及到时区。ZoneId
,ZoneRules
和ZoneOffset
类描述了时区,时区偏移量和时区规则。ZonedDateTime
类,代表了与时区关联的时间和日期。OffsetDateTime
和OffsetTime
分别代表了日期和时间和时间。这些类描述了时区偏移。Duration
类在秒和毫秒尺度丈量一段时间。Period
类在年、月和日尺度上丈量一段时间。
其他不是ISO日历系统的可以使用java.time.chrono
包中的类。这里不介绍啦。
三、实例
3.1 获取当前日期和时间
LocalDate
可以表示当前日期。它只包含日期不包含时分秒。
LocalTime
可以表示当前时间。它不包含日期。
LocalDate date = LocalDate.now();
System.out.println(date);
LocalTime time = LocalTime.now();
System.out.println(time);
// 输出
2017-03-07
23:16:45.433
由此可见它输出的日期是格式化后的。
3.2 获取当前年月日
LocalDate now = LocalDate.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
System.out.println(year);
System.out.println(month);
System.out.println(day);
// 输出
2017
3
7
不用考虑用java.util.Calendar
月份从0开始的问题。
3.3 获取指定日期**
LocalDate date = LocalDate.of(2017, 2, 14);
System.out.println(date);
// 输出
2017-02-14
根据月日判断日期是否相等
MonthDay
不包含年份信息。可以用来代表每年重复出现的日期。
LocalDate now = LocalDate.now();
System.out.println(MonthDay.from(now));
System.out.println(MonthDay.of(6,1));
System.out.println(MonthDay.from(now).equals(MonthDay.of(6,1)));
// 输出
--03-07
--06-01
false
可以看到年份被-代替了。
3.4 日期格式化与解析
// 将字符串解析为日期对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2017-06-01",formatter);
System.out.println(date);
// 将日期重新格式化输出
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd");
System.out.println(date.format(formatter2));
// 输出
2017-06-01
2017:06:01
3.5 增加(减少)固定的时间
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime);
// 增加1小时
dateTime = dateTime.plusHours(1);
System.out.println(dateTime);
// 增加1天
dateTime = dateTime.plusDays(1);
System.out.println(dateTime);
// 输出
2017-03-08T13:56:00.728
2017-03-08T14:56:00.728
2017-03-09T14:56:00.728
都是.plusXXX,如果想减少,传入负数即可。
3.6 增加(减少)固定的时间第二种方式
LocalDate date = LocalDate.now();
System.out.println(date);
LocalDate nextWeek = date.plus(1, ChronoUnit.WEEKS);
System.out.println(nextWeek);
// 输出
2017-03-08
2017-03-15
ChronoUnit
类有许多常用单位,意思也很容易明白。
3.7 比较日期前后顺序
LocalDate today = LocalDate.now();
LocalDate childrensDay = LocalDate.of(2017,6,1);
System.out.println(today.isAfter(childrensDay));
System.out.println(childrensDay.isAfter(today));
// 输出
false
true
3.8 判断是否是闰年
LocalDate today = LocalDate.now();
System.out.println(today.isLeapYear());
// 输出
false
3.9 计算两日期间的天数等
LocalDateTime today = LocalDateTime.now();
LocalDateTime childrensDay = LocalDateTime.of(2017,6,1,0,0,0);
Duration duration = Duration.between(today,childrensDay);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
LocalDate today2 = LocalDate.now();
LocalDate childrensDay2 = LocalDate.of(2017,6,1);
Period period = Period.between(today2,childrensDay2);
System.out.println(period.getMonths());
System.out.println(period.getYears());
// 输出
84
2017
2
0
3.10 新旧Date转换
Date d = new Date();
Instant i = d.toInstant();
// 转换成北京时间
LocalDate date = i.atOffset(ZoneOffset.ofHours(8)).toLocalDate();
Instant timestamp = Instant.now();
Date d = Date.from(timestamp);
3.11 获取当前毫秒
Clock clock = Clock.systemUTC();
System.out.println(clock.millis());
// 输出
1488984534369
3.12 获取两个日期间相差天数
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse("2017-12-01",formatter);
LocalDate today = LocalDate.now();
System.out.println(ChronoUnit.DAYS.between(date,today));
// 输出
5
以后有什么好的例子再补充
Java 8 Date-Time API概览的更多相关文章
- Java 8 Date Time API Example Tutorial – LocalDate, Instant, LocalDateTime, Parse and Format
参考 Java 8 Date and Time API is one of the most sought after change for developers. Java has been mis ...
- Java之Date Time API (Java 8 新特性)
Java 8 – Date Time API Java 8 comes with a much improved and much required change in the way date an ...
- [转载]Java 8 日期&时间 API
Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...
- [转载]java中Date,SimpleDateFormat
一.Java中的日期概述: 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java ...
- 【spring mvc】后台API查询接口,get请求,后台Date字段接收前台String类型的时间,报错default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createDate';
后台API查询接口,get请求,后台Date字段接收前台String类型的时间筛选条件 后台接口接收 使用的实体 而createDate字段在后台实体中是Date类型 报错信息: org.spring ...
- java.util.Date和jdk1.8新时间API比拼
旧的时间和日期的API的缺陷 Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的. Date如果不格式化,打印出的日期可 ...
- V8世界探险 (1) - v8 API概览
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/detai ...
- Java中日期时间API小结
Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...
- Java的Date和Time入门教程
本文是一篇翻译文章,已取得原作者授权,原文地址是http://tutorials.jenkov.com/java-date-time/index.html Java语言的JDK中关于日期和时间的API ...
- String与Date(java.util.Date)互转(转)
http://yunnick.iteye.com/blog/1074495 一.String与Date(java.util.Date)互转 1.1 String -> Date String d ...
随机推荐
- centos 7编译安装Python3.6.1
1.准备必要的库文件 yum install -y gcc zlib-devel openssl-devel sqlite-devel 2.进入源代码包 ./configure prefix=/usr ...
- MYSQL 缓存
在PHP.INI中query_cache_type设置为1. 即 开始MYSQL全局SQL语句 都缓存.(0 不使用) 临时关闭查询缓冲的方法:1. SELECT SQL_NO_CACHE fi ...
- media(适配)
媒体类型 1.all 所有媒体 2.braille 盲文触觉设备 3.embossed 盲文打印机 4.print 手持设备 5.projection 打印预览 ...
- R语言格式化数字和字符串format函数
数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...
- BEA WebLogic平台下J2EE调优攻略--转载
BEA WebLogic平台下J2EE调优攻略 2008-06-25 作者:周海根 出处:网络 前 言 随着近来J2EE软件广泛地应用于各行各业,系统调优也越来越引起软件开发者和应用服务器提供 ...
- Java Stream File & IO
摘录自:http://www.runoob.com/java/java-files-io.html Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需 ...
- Metronic 对话 chat
http://keenthemes.com/preview/metronic/theme/admin_1/index.html: jquery让滚动条默认在最底部:$('#content').scro ...
- rust by example 2
本来这篇准备明天在写的,但正好今天的Release没出问题,就接着写吧 rust里的原生类型: 有符号整数: i8, i16, i32, i64和isize(指针大小) 无符号整数:u8, u16, ...
- 十四、ReentrantLock重入锁
一.简介 JDK提供了Lock接口来实现更丰富的锁控制,ReentrantLock即Lock接口的实现 JDK文档:http://tool.oschina.net/uploads/apidocs/jd ...
- memcached 细究(一)
memcached是高性能的分布式的内存缓存服务器.由国外社区网站LIVEJOURNAL的开发团队开发. 使用目的: 通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度.提高可扩 ...