更新时间: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, LocalTimeLocalDateTime类提供了人类视角的日期和时间,不涉及到时区。
  • ZoneId, ZoneRulesZoneOffset类描述了时区,时区偏移量和时区规则。
  • ZonedDateTime类,代表了与时区关联的时间和日期。OffsetDateTimeOffsetTime分别代表了日期和时间和时间。这些类描述了时区偏移。
  • 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概览的更多相关文章

  1. 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 ...

  2. 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 ...

  3. [转载]Java 8 日期&时间 API

    Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...

  4. [转载]java中Date,SimpleDateFormat

    一.Java中的日期概述: 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java ...

  5. 【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 ...

  6. java.util.Date和jdk1.8新时间API比拼

    旧的时间和日期的API的缺陷 Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的. Date如果不格式化,打印出的日期可 ...

  7. V8世界探险 (1) - v8 API概览

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/detai ...

  8. Java中日期时间API小结

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

  9. Java的Date和Time入门教程

    本文是一篇翻译文章,已取得原作者授权,原文地址是http://tutorials.jenkov.com/java-date-time/index.html Java语言的JDK中关于日期和时间的API ...

  10. String与Date(java.util.Date)互转(转)

    http://yunnick.iteye.com/blog/1074495 一.String与Date(java.util.Date)互转 1.1 String -> Date String d ...

随机推荐

  1. Types方法之isCastable-isConvertible

    5. Conversions and Promotions 5.1. Kinds of Conversion 5.1.1. Identity Conversion 5.1.2. Widening Pr ...

  2. 基础js--调试js

    1,逻辑错误 常见错误: 是否由于拼写错误而导致申明了新的变量? 是否在条件判定上出现了疏漏? 方法:使用开发者工具调试代码 2,代码错误 常见错误: 是否拼写错误? 是否使用中文的符号? 扩展: 1 ...

  3. 配置Linux本地源镜像

    今天看到同事做了一个公司本地的apache镜像源,感觉好叼的样子.然后就自己上网找些资料,尝试自己搭建一套出来.然后就有了这篇博文... 声明:本文中充满了浓浓的技术嫉妒的心理,阅读需谨慎. 本文以 ...

  4. KNN理解

    基本思想 K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中.如下面的图: 通俗一点来说,就是找最 ...

  5. Google Java 编程风格指南 —— 见微知著

    目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...

  6. 每天一道leetcode234-回文链表

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 2018. ...

  7. 如鹏网学习笔记(九)JavaScript

    JavaScript笔记 一.JavaScript简介 1,JavaScript是一种计算机编程语言,可以像等其他编程语言那样定义变量,执行循环等. 2,JavaScript代码主要执行在浏览器上,为 ...

  8. 使用Docker镜像部署ELK日志系统

    使用Docker部署elasticsearch.logstash.kibana 指定版本:6.7.1 (建议使用同一的版本.屏蔽三个软件间的不兼容性) 下载镜像: docker pull elasti ...

  9. 代码实现SpringMvc

    偶然看到一篇100多行实现SpringMvc的博客,阅读后整理加实现出来.大家共勉!(纸上得来终觉浅,绝知此事要躬行.) 实现Spring的部分. Bean工厂,统一创建Bean: IOC,实现Bea ...

  10. Dubbo(二) 一次惨痛的流血事故

    时间定位到2018年11月某某一天,我正在看看Spring源码的文档,趁着没啥事,忽然想起Dubbo是基于Schema扩展的,所以就翻了下Dubbo的源码. 然后的然后,有活要干了,写完代码后,启动工 ...