jdk8 time时间类api(一)

一、 日期类API导学


设计初衷:Java原本自带的java.util.Datejava.util.Calendar类,实际上两种类有线程不安全的风险(虽然学习的时候处于单线程环境并不会出现问题),但是之后到了企业中还是可能会增加学习成本,重新学习如何处理时间,所以推出了这个Java8的最新时间类库的讲解,希望降低学生的学习成本,能够更快的融入到企业开发实战中去。

课程目标

  • 掌握Java8中提供的java.time包中的常用日期与相关方法

  • 可以从java.util包下的日期类相关类过度到java.time包下的日期类

  • 掌握Java8中的日期与字符串之间的相互转换

学习此课程需要的基础知识

  • java.util.Date与java.util.Calendar类的相关基础知识

  • 线程相关的基础知识

开发环境

  • IDEA + JDK1.8

适合人群

  • Java初学者

  • 再企业中有从老版本的日期类转换到新版本的日期类需求的人员

二、 老版本API计算困难问题

为什么会出现新的日期类API

JAVA面世之初,标准库就引入了两种用于处理日期和时间的类,它们是java.util.Datejava.util.Calendar。而前者堪称类糟糕的设计典范,浏览API可以发现,从Java1.1开始,Date 类中的所有方法就已经被弃用,Java1.1推荐采用Calendar类处理日期和时间,但是这个类同样存在不少问题。

对于日期的计算困难问题

毫秒值与日期直接转换比较繁琐,其次通过毫秒值来计算时间的差额步骤较多

image

三、老版本API线程不安全问题

SimpleDateFormat类是线程不安全的,在多线程的情况下,全局共享一个SimpleDateFormat类中的Calendar对象有可能会出现异常。

微信截图_20200525074956.png

另外一个问题就是在java.util.Date和java.util.Calendar类之前,枚举类型(ENUM)还没有出现,所以在字段中使用整数常量导致整数常量都是可变的,而不是线程安全的。 为了处理 实际开发中遇到的问题,标准库随后引入了java.sql.Date作为java.util.Date的子类,但是还是没能彻底解决问题。最终JavaSE 8中引入了java.time包,这种全新的包从根本上解决了长久以来存在的诸多弊端,java.time包基于Joda-Time库构建,是一种免费的开源解决方案,实际上在Java 8没有出现之前,公司中已经广泛使用Joda-Time来解决Java中的日期与时间问题,Joda-Time的设计团队也参与了java.time包的开发。

四、老版本API使用规范问题

微信截图_20200525075108.png

五、java.time包->常用类的概述和功能介绍

Instant类

Instant类对时间轴上的单一瞬时点建模,可以用于记录应用程序中的事件时间戳,之后学习的类型转换中,均可以使用Instant类作为中间类完成转换。

Duration类

Duration类表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。

Period类

Period类表示一段时间的年、月、日。

LocalDate类

LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年月日。

LocalTime类

LocalTime是一个不可变的日期时间对象,代表一个时间,通常被看作是小时-秒,时间表示为纳秒精度。

LocalDateTime类

LocalDateTime类是一个不可变的日期时间对象,代表日期时间,通常被视为年-月-日=时-分-秒。

ZonedDateTime类

ZonedDateTime是具有时区的日期时间的不可变表示,此类存储所有日期和时间字段,精度为纳秒,时区为区域偏移量,用于处理模糊的本地日期时间。

now方法在日期/时间类的使用

Date-Time API中的所有类均生成不可变实例,它们是线程安全的,并且这些类不提供公共构造函数,也就是说没办法通过new的方式直接创建,需要采用工厂方法加以实例化。

六、now方法在日期时间类中的应用1

** now方法可以根据当前日期或时间创建实例。**

微信截图_20200525075315.png

七、now方法在日期时间类中的应用2

不仅仅是以上提供的及各类可以使用now方法,Java8的Time包种还提供了其它几个类可以更精准的获取某些信息。

Year类(表示年)

YearMonth类(表示年月)

MonthDay类(表示月日)

微信截图_20200525075346.png

八、of方法在日期/时间类的应用

指定任意时间节点

of方法可以根据给定的参数生成对应的日期/时间对象,基本上每个基本类都有of方法用于生成的对应的对象,而且重载形式对边,可以根据不同的参数生成对应的数据。

微信截图_20200525075542.png
微信截图_20200525075603.png

九、时区信息的获取(拓展)

在学习ZonedDateTime的时候,发现这个对象里面封装的不仅有时间日期,并且还有偏移量+时区,那么时区如何在Java中获取呢?通过提供的一个类ZonedId的getAvailableZoneIds方法可以获取到一个Set集合,集合中封装了600个时区。

微信截图_20200525075727.png

十、添加时区信息与获取其它时区时间

我们可以通过给 LocalDateTimem添加时区信息来查看到不同时区的时间,比如说 LocalDateTime中当前封装的是上海时间,那么想知道此时此刻,纽约的时间是多少,就可以将纽约的时区Id添加进去,就可以查看到了,方式如下:

  • 封装时间 LocalDateTime 并添加时区信息。

  • 更改时区信息查看对应时间。

微信截图_20200525075827.png

十一、Month枚举类的使用

java.time包中引用了Month的枚举类,Month中包含标准日历中的12个月份的常量(从JANUARY到DECEMEBER)也提供了一些方便的方法供我们使用。

推荐在初始化LocalDate和LocalDateTime对象的时候,月份的参数使用枚举的方式传入,这样更简单易懂而且不易出错,因为如果是老的思维,Calendar传入0的话,那么会出现异常。

微信截图_20200525075935.png

十二、章节练习(1)

微信截图_20200525080133.png

十三、plus方法在LocalDate中的使用

想要修改某个日期/时间对象的现有实例时,我们可以使用 plusminus方法来完成操作。

Java8中日期时间相关的API中的所有实例都是不可改变的,一旦创建LocalDate,LocalTime,LocalDateTime就无法修改他们(类似于String),这对于线程安全时非常有利的。

plus方法在LocalDate与LocalTime中的使用

  • LocalDate中定义了多种对日期进行增减操作的方法。
LocalDate plusDay(long days) 增加天数

LocalDate plusWeeks(long weeks) 增加周数

LocallDate plusMonths(long months) 增加月数    

LocalDate plusYears(long years) 增加年数
微信截图_20200525080351.png

minus方法与以上类似。

十四、plus方法在LocalTime中的使用

LocalTime中定义了多种对事件进行增减操作的方法

LocalTime plusNanos(long nanos) 增加纳秒

LocalTime plusSeconds(long seconds) 增加秒

LocalTime plusMinutes(long minutes) 增加分钟

LocalTime plusHours(long hours) 增加小时

微信截图_20200525080538.png

十五、plus的单独使用方式1

本文中都是使用plusXXX的方法进行演示,实际上也有对应的减少方法,以minus开头的方法对应的即为减少,实际上也有对应的减少方法,以minus开头的方法对应的即为减少,实际上minus方法调用的也是plus方法,只不过传入的参数是负数。

plus 和 minus 方法的应用

刚才学习到的plusXXX相关的方法都是添加了数值到具体的某一项上,根据观察还有两个单独的plus方法,接下来我们来学习这两个单独的plus方法。

plus(long amountToadd, TemporalUnit unit) LocalTime

plus(TemporalAmount amoutToadd) LocalTime

TemporalAmount 是一个接口,当接口作为方法的参数的时候,实际上传入的是接口的实现类对象,根据查看这个接口的体系,可以看到这个接口有一个实现类,名字叫做Period,在学习第一节的时候,说明了这个 嘞表示一段时间。

微信截图_20200525080645.png

如何使用Period来表示一段时间呢?这个类本身提供了of(int year, int month, int day)来表示,例如:Period.of(1,2,3)返回的对象即为1年2个月3天这么一个时间段。

微信截图_20200525080755.png

十六、plus的单独使用方式2

plus(long amountToadd, TemporalUnit unit)

在实际开发过程中,可能还会更精准的去操作日期或者说增加一些特殊的时间,比如说1个世纪、1个半天,1千年,10年等,Java8提供了这些日期的表示方式而不需要去单独进行计算了。

TemporalUnit是一个接口,通过查看体系接口发现,可以使用子类ChronoUnit来表示,ChronoUnit封装了很多时间段供我们使用。

微信截图_20200525080915.png

十七、with方法的使用方式1

with方法在LocalDateTime类的应用

如果不需要对日期进行加减而是要直接修改日期的话,那么可以使用with方法,with方法提供了很多种修改时间的方式

LocalDateTime withNano(int i) 修改纳秒

LocalDateTime withSecond(int i) 修改秒

LocalDateTime withMinute(int i) 修改分支

LocalDateTime withHour(int i) 修改小时

LocalDateTime withDayOfMonth(int i) 修改日

LocalDateTime withMonth(int i) 修改月

LocalDateTime withYear(int i) 修改年

微信截图_20200525081028.png

十八、with方法的使用方式2

with(TemporalField field, long newValue)

temporalField是一个接口,通过查看体系结构,可以使用它的子类

ChronoField,ChronoField中封装了一些日期时间中的组成成分,可以直接选择之后传入第二个参数进行修改。

例如:with(ChronoField.DAY_OFMONTH,1);将日期中的月份中的天数改为1

例如:with(ChronoField.YEAR,2021);将日期中的年份改为2021。

微信截图_20200525081151.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249