文档章节

新款时间日期API已上线

Garrry
 Garrry
发布于 2016/01/18 17:35
字数 2089
阅读 193
收藏 9

历史

   早期,Java 对时间和日期的使用往往重度依赖 java.util.Datejava.util.Calendar。 可惜的是,这2个api 本身不够健壮,有类似线程不安全等诸多问题,于是乎2000年左右,市面上出现了很多用于处理时间类的框架,如Joda-Time。 在Java 8 时代 官方为JDK开发新的时间/日期API的进程:JSR-310,启动了。于是就出现了新一套健壮的API。

 

Roadmap

新的API

Java 8  中 新的API 包括了 5个包

  • java.time

  • java.time.chrono

  • java.time.format

  • java.time.temporal

  • java.time.zone

    java.time 是基础包,里面包含了 时间 日期的 基础类 如  LocalDate, LocalTime等

    java.time.chrono  有点像linux 的守护进程 chronyd  用来访问不同的时间服务器。

    java.time.format 顾名思义用来格式化和转换日期时间

    java.time.temporal 可能也想不出好名字吧,里面都是些底层扩展类

    java.time.zone 用来对各时区的支持

 

1. 时间线

     Java8中 引入了时间线的概念,时间是连续不断,抽象成一条线,线上的点表示某一时刻。

一班来说,这个设定主要是面对机器的,不用关心具体的年月日时分秒,内部以秒或者纳秒表示。

1.1 时间点 Instant

      时间点是表示时间的某时某刻的,相对的它是时间线上的一点。

java.time包通过值类型Instant提供机器视图。

Instant表示时间线上的一点,而不需要任何上下文信息(时区,年份)

概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。

因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

Instant start = Instant.now()
Instant end = Instant.now()

 

1.2 Period

    Period表示以年、月、日衡量的时长。例如,“3年2个月零6天”。表示的是一段时间 以日月年为单位.

在日期的操作中 可以作为参数来作为日期的加减运算。

Period period = Period.now()

1.3 Duration

    Duration表示以秒和纳秒为基准的时长。例如,“23.6秒”。Duration表示的是一段时间 以 分十秒为单位. 在时间的操作中 可以作为参数 来作为时间的加减运算。

Duration duration = Duration.()System..println(duration)System..println(duration.getSeconds())

 

--------------------------TBD-----------------------

 

2. 不变模式  Immutable

    新的API 提倡采用不变模式,虽然时间是一直在变化的,某事某刻的表示它是固定的,哪怕对日期进行加减,操作之后的日期则表示新的时刻。

   所以Java时间相关的API,在原始时间对象上 做相应的加减操作,原来的日期对象不变,会产生一个新的对象。

3. 本地时间

3.1 本地日期 LocalDate

 LocalDate 是新API 中 最基础也是最重要的类, 它是一个 不可变的类(final 修饰),本地日期只是一个术语,用来表示一个具体日期,不同地区的日期可能不同 故采用 local 这个术语,其实它是时区无关的,这个类没有包含任何时区信息,就简单的认为一个日期即可。

3.1.1 日期的创建

   日期的创建 采用了工厂方法的模式,所有的创建方法都是私有的,常用的是调用对外开放的方法of 来生成一个 日期实例

LocalDate localDate = LocalDate.of(int year, Month month, int dayOfMonth);
LocalDate localDate = LocalDate.of(int year, int month, int dayOfMonth);

 

3.1.2 日期的常用方法 - 读

 

    LocalDate 的toString方法 默认返回的日期格式  采用 ISO-8601标准日期  即   YYYY-MM-DD

System.out.println(localDate); //2016-02-18

   LocalDate 还提供了其他很多常用方法来获得日期的相关值

System.out.println(localDate.getMonth());       // Month FEBRUARY 当前月
System.out.println(localDate.getMonthValue());  // int  1 当前月的数值

System.out.println(localDate.getDayOfMonth());  // int 18 当前月第X天
System.out.println(localDate.getDayOfWeek());   // DayOfWeek  Monday 当前周的天
System.out.println(localDate.getDayOfYear());   // int 49 当前年的第X天

System.out.println(localDate.getYear());        // int 2016 当前年

System.out.println(localDate.lengthOfYear());   // int 366 当前年共有多少天
System.out.println(localDate.lengthOfMonth());  // int 29  当前月共有多少天

3.1.3 日期的常用方法 - 操作

LocalDate 是一个不可变的类,它的每一次操作 都会伴随生成一个新类

localDate.withYear()
localDate.plusMonths()
localDate.minusDays())

3.1.4 日期的常用方法 - 属性判断

LocalDate 也提供了一些属性判断的功能

 localDate.isLeapYear(); // true (是闰年)

 

3.2 本地时间 LocalTime

    LocalTime 的用法和 LocalDate 类似同样与与时区无关,  它的默认格式也是采用 ISO-8601 格式为 HH:mm:ss

时间的创建

LocalTime localTime = LocalTime.of(int hour, int minute, int second);
LocalTime localTime = LocalTime.of(int hour, int minute, int second, int nanoOfSecond)
LocalTime localTime = LocalTime.of(int hour, int minute);

例子:

LocalTime localTime = LocalTime.of(17,10,58);

3.3 本地日期时间的组合 LocalDateTime

TBD

 

-------------------------------------Example TBD------------------------------

 

4 时区时间

时区 Zone

5 时间工具

5.1 时间计算器 ChrononUnit

ChronoUnit类可用于在单个时间单位内测量一段时间,例如天数或秒。

LocalDate startDate = LocalDate.of(1993, Month.OCTOBER, 19);
System.out.println("开始时间  : " + startDate);

LocalDate endDate = LocalDate.of(2017, Month.JUNE, 16);
System.out.println("结束时间 : " + endDate);

long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println("两天之间的差在天数   : " + daysDiff);

5.2 格式转换器 DateTimeFormatter

    Java 8 中 java.time.format 中 围绕  DateTimeFormatter 构建了时间的解析与转换。Java 8 默认的时间显示格式是,ISO 8601标准格式。

5.2.1 使用格式转换器

采用DateTimeFormatter.format() 方法进行格式化输出。

首先需要实例化一个具体对应的时间格式转换器。

如要格式化LocalDate 则需要实例化一个针对LocalDate的转换器

需要注意的是转化器与日期时间对象要一一对应切不可 

LocalDate对象 用DateTimeFormatter.ofLocalDateTime.

这样会抛出UnsupportedTemporalyException.

在实例化一个转换器 需要传递一个格式参数,Java8提供了 预定义的格式和自定义声明

DateTimeFormatter shortDateTime = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
DateTimeFormatter shortDateTime = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
DateTimeFormatter shortDateTime = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);

5.2.1.1 预定格式 FormatStyle

FormatSyle 是一个枚举类,它包括了Full,LONG,MEDIUM,SHORT几种常规的格式。

FormatStyle.FULL  // 'Tuesday, April 12, 1952 AD' or '3:30:42pm PST'.
FormatStyle.LONG // 'January 12, 1952'
FormatStyle.MEDIUM // 'Jan 12, 1952'.
FormatStyle.SHORT //'12.13.52' or '3:30pm'.

5.2.1.2 自定义格式 Pattern

除了之前介绍的一些预定义格式以外,还可以输出一些自定义的时间格式。采用字符串匹配模式

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm");

规则:

一般采用以下规则
 * MMMM 对应月份
   M outputs 1, 
   MM outputs 01, 
   MMM outputs Jan,
   MMMM outputs January.

 * dd,DD 对应天数
 * YYYY,YY,yyyy,yy 对应年份
 * HH 对应 24小时制的 小时
 * hh 对应 12小时制的 小时
 * mm 对应 分钟
 * ss 对应 秒
 * SS 对应 毫秒

此外 还可以包括 类似 / , : - 等分隔符

DateTimeFormatter f1 = DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm");
System.out.println(dateTime.format(f1)); // January 20, 2020, 01:12
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("MM dd, yyyy, hh:mm");
System.out.println(dateTime.format(f2)); // 01 20, 2020, 01:12

DateTimeFormatter f3 = DateTimeFormatter.ofPattern("MMMM DD, YY, HH:mm");
System.out.println(dateTime.format(f3)); // January 20, 2020, 13:12
DateTimeFormatter f4 = DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm");
System.out.println(dateTime.format(f4)); // January 20, 2020, 01:12

DateTimeFormatter f5 = DateTimeFormatter.ofPattern("MMMM dd, yy, hh:mm:ss");
System.out.println(dateTime.format(f5)); // January 20, 2020, 01:12:34
DateTimeFormatter f6 = DateTimeFormatter.ofPattern("MMMM dd, yyyy, hh:mm:ss:SS");
System.out.println(dateTime.format(f6)); // January 20, 2020, 01:12:00

5.2.1.3 预留对象 DateTimeFormatter.IOS***

Java8 预先定义了一些常用格式的转换器,可以免去 自定义的麻烦.

DateTimeFormatter 内置了这些对象,可以直接调用。

DateTimeFormatter.ISO_LOCAL_DATE  //'2011-12-03'
DateTimeFormatter.ISO_OFFSET_DATE //'2011-12-03+01:00'
DateTimeFormatter.ISO_DATE        //'2011-12-03' or '2011-12-03+01:00'
DateTimeFormatter.ISO_LOCAL_TIME  //'10:15' or '10:15:30'
DateTimeFormatter.ISO_OFFSET_TIME //'10:15+01:00' or '10:15:30+01:00'
DateTimeFormatter.ISO_TIME        //'10:15', '10:15:30' or '10:15:30+01:00'
DateTimeFormatter.ISO_LOCAL_DATE_TIME //'2011-12-03T10:15:30'
DateTimeFormatter.ISO_OFFSET_DATE_TIME//'2011-12-03T10:15:30+01:00'
DateTimeFormatter.ISO_ZONED_DATE_TIME //'2011-12-03T10:15:30+01:00'

5.2.2 内置Format方法

    时间日期相关类自带一个formate(DateTimeFormatter.TYPE)方法,需要传递一个格式转换器,会根据格式转换器定义的格式做相应的转换。

//创建本地时间
LocalDate date = LocalDate.of(2020, Month.JANUARY, 20);
LocalTime time = LocalTime.of(11, 12, 34);
LocalDateTime dateTime = LocalDateTime.of(date, time);

date.format(DateTimeFormatter.ISO_LOCAL_DATE)); //2020-01-20
dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); //2020-01-20T11:12:34
time.format(DateTimeFormatter.ISO_LOCAL_TIME)); //11:12:34

date.format(DateTimeFormatter.ISO_DATE); //2020-01-20
dateTime.format(DateTimeFormatter.ISO_DATE_TIME); //2020-01-20T11:12:34
time.format(DateTimeFormatter.ISO_TIME); //11:12:34

5.3 时间解析器 Parser

 时间的解析和DateTimeFormatter中 ofPatter 结合使用 

配合要解析的字符串对应 时间 就可以了。

DateTimeFormatter f = DateTimeFormatter.ofPattern("MM dd yyyy");
LocalDate date = LocalDate.parse("01 02 2015", f);
LocalTime time = LocalTime.parse("11:22");
System.out.println(date); // 2015-01-02
System.out.println(time); // 11:22

5.4

6 JDBC 与新日期

最新JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:

SQL -> Java
--------------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime

 

© 著作权归作者所有

Garrry
粉丝 27
博文 46
码字总数 48703
作品 0
浦东
技术主管
私信 提问
有用户在百思买买到谷歌还未发布的新款Chromecast

据外媒报道,还有两周时间谷歌将举行一场产品发布会,届时,它将带来Pixel 3和Pixel 3 XL。除了新款手机之外,预计这家公司还会发布全新的Chorombook、智能音箱,另外还可能会有一款新款的C...

稿源:
2018/09/30
0
0
重新定义时间轴

最近读了Reid Havens在PowerPivotPro上发表的一篇《产品上线时间后比较表现》的文章,不同产品上线的时间不同,通过自定义时间轴来把所有产品的上线时间调整到同一个起点作比较。 该分析方法...

马世权
2017/09/09
0
0
Google的全新在线地图API演示网站 - More than a map

日期:2012-10-28 来源:GBin1.com More Than A Map是Google最新上线的Google地图API使用的演示网站,提供了丰富的Google Maps API的使用。 包括一下几个方面的功能展示: 基础功能 卫星功能...

gbin1
2012/10/29
13
0
前端小纠结--自带“歧视性”的IE11 input事件

第一次碰到自带的歧视的bug,IE 11泥潭不解释。 起因 的在IE11下calendar panel无法正常展开,看图。 具体的相关讨论看参考链接中的部分。 因为我知道IE和firefox、chrome下时间处理有问题(...

前端小纠结
07/03
0
0
ECSHOP广告时间更加精确到时分秒

首先这是一个很生僻的问题,只是近日有人问到此类问题。所以写了出来。 原问题好像是问“ECSHOP广告位的上线时间能不能具体到某个小时?” 大家都知道,ECSHOP后台里,碰到选择时间的地方默认...

Android1989
2014/08/14
231
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Web 中对 ServletRequest 的一些非常规操作解决方案

1. 前言 ServletRequest 是我们搞 Java Web 经常接触的 Servlet Api 。有些时候我们要经常对其进行一些操作。这里列举一些经常的难点操作。 2. 提取 body 中的数据 前后端交互我们会在 body...

码农小胖哥
27分钟前
2
0
《Dual Encoding U-Net for Retinal Vessel Segmentation》阅读笔记-MICCAI2019

作者:Bo Wang1,2, Shuang Qiu2, and Huiguang He1,2,3 目的:Retinal Vessel Segmentation is an essential step for the early diagnosis of eye-related diseases, such as diabetes and ......

JungleKing
29分钟前
2
0
一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
43分钟前
4
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
45分钟前
5
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部