datetime和timestamp哪个范围大(Date-Time代替Date)(1)

java 8 提供了 Date-Time 包专门用来处理时间,其主要是为了解决之前版本的Date和Calendar等其它日期时间相关类的各种问题.诸如线程安全问题,API混乱、重叠、包混乱等等问题。

在Java 8 中,`java.time`这个包专职时间处理,所有新增的相关的日期时间类都在这个包下面.而为了避免前面版本出现的一些线程安全等问题,这个包下的所有可能引起线程安全的类和对象属性都以final修饰.

Java 8 新的日期时间包还增加了对时区更好的支持,也是在java.time包页面,不用再像以前一样,还需要使用像外挂一样的功能模块来支撑.

下面,我们就根据我们平常使用最多的几项来对新的 Data-Time 相关功能来实 体验

datetime和timestamp哪个范围大(Date-Time代替Date)(2)

先看几个小知识点

datetime和timestamp哪个范围大(Date-Time代替Date)(3)

Date-Time 小知识点

获取当前时间

在很多时候,我们都会在程序中去获取当前时间,以前我们可能是 new Date(),或者 Calendar.getInstance().........,等等这样,那么在Java 8 往后,我们有很多便捷的方法可以使用.

datetime和timestamp哪个范围大(Date-Time代替Date)(4)

获取当前日期时间等

获取不同时区的当前时间

现在有了更方便的时区支持,我们何不体验一下?Zone........

datetime和timestamp哪个范围大(Date-Time代替Date)(5)

获取不同时区的时间

获取其它常用的当前时间值

比如我们在程序中有时会只想要当前的日期,当前的时分秒,当前的时间戳等需求.Date-Time都有很方便的api供我们实现这些目标.

datetime和timestamp哪个范围大(Date-Time代替Date)(6)

根据给定参数初始化LocalDateTime&LocalDate等实例.

在开发中,已知时间的部分参数.实例化一个日期时间对象,然后方便参数传递和时间操作.

datetime和timestamp哪个范围大(Date-Time代替Date)(7)

根据已有参数初始化时间对象

读取一个LocalDateTime对象包含的信息

一个日期时间对象,包含年,月,日等等信息,开发过程中需要得到每项信息.

Date-Time的信息获取更便捷明了.

datetime和timestamp哪个范围大(Date-Time代替Date)(8)

解析LocalDateTime对象

有了一个日期时间对象后,对时间的增减等处理,以获取新时间

2个月后的今天、3天后的此刻,30分钟后的时间等等这样的需求在开发中很常见,而在Java 8 的Date-Time 对这类需求着重考虑过,所以的它的相关方法都很简单直接,减少了很多会有歧义的操作.

datetime和timestamp哪个范围大(Date-Time代替Date)(9)

常用日期时间计算

常用日期和时间等值的获取方式

就Date-Time的相关API,来实现以往经常会用到的各类日期和时间的获取.

如:本月1号,下月1号,本月最后一天,今日零时等等诸如此类的时间节点.

datetime和timestamp哪个范围大(Date-Time代替Date)(10)

常用日期时间节点获取

时间校验和比较

时间的校验和比较也是常用,在新的API中对比较日期时间这样的需求提供了很明确的几个API,如:isBefore,isAfter,compareTo,isEqual等.

datetime和timestamp哪个范围大(Date-Time代替Date)(11)

时间校验与比较

在Java 8 的 Date-Time中专门提供了一个 isLeapYear()方法用来判断是不是闺年,这个是真的很人性化了.以前总是自己定义闺年判断的时代可以过去了.

在日期时间对象比较时:注意,equals方法和isEqual方法的区别,简单理解就是equals方法是严格比对,类型和值都要相等才返回true,而后者只比对值.

Java 8 的时间求差是相当人性化了

话不多说,直接看代码

datetime和timestamp哪个范围大(Date-Time代替Date)(12)

取缔 SimpleDateFormatter

个人觉得,Java 8 的日期格式化非常好用,语法简单明了,没有太多歧义,一眼即上手.

先看下在 DateTimeFormatter格式化相关规则知识:

/* *格式器中的字符对应的含义. *<pre> * Symbol Meaning Presentation Examples * ------ ------- ------------ ------- * G era text AD; Anno Domini; A * u year year 2004; 04 * y year-of-era year 2004; 04 * D day-of-year number 189 * M/L month-of-year number/text 7; 07; Jul; July; J * d day-of-month number 10 * * Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter * Y week-based-year year 1996; 96 * w week-of-week-based-year number 27 * W week-of-month number 4 * E day-of-week text Tue; Tuesday; T * e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T * F week-of-month number 3 * * a am-pm-of-day text PM * h clock-hour-of-am-pm (1-12) number 12 * K hour-of-am-pm (0-11) number 0 * k clock-hour-of-am-pm (1-24) number 0 * * H hour-of-day (0-23) number 0 * m minute-of-hour number 30 * s second-of-minute number 55 * S fraction-of-second fraction 978 * A milli-of-day number 1234 * n nano-of-second number 987654321 * N nano-of-day number 1234000000 * * V time-zone ID zone-id America/Los_Angeles; Z; -08:30 * z time-zone name zone-name Pacific Standard Time; PST * O localized zone-offset offset-O GMT 8; GMT 08:00; UTC-08:00; * X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15; * x zone-offset offset-x 0000; -08; -0830; -08:30; -083015; -08:30:15; * Z zone-offset offset-Z 0000; -0800; -08:00; * * p pad next pad modifier 1 * * ' escape for text delimiter * '' single quote literal ' * [ optional section start * ] optional section end * # reserved for future use * { reserved for future use * } reserved for future use * </pre> * */

丰富了格式化的规则定义,而且看样子,未来的进化也是很值得期待的.接下来看一些实例

datetime和timestamp哪个范围大(Date-Time代替Date)(13)

预定义格式器使用

datetime和timestamp哪个范围大(Date-Time代替Date)(14)

自定义格式器使用

datetime和timestamp哪个范围大(Date-Time代替Date)(15)

日期格式化输出

怎么从Date过渡到LocalDate(Time)?

既然Date-Time这么牛逼了.但是老项目中还是Date&Calendar,现在想用LocalDateTime怎么以办?其实Oracle也是考虑到这方面的,所以两者之间并不是不能互通.

Instant是时间戳,它就是前述两者互通的关键.

datetime和timestamp哪个范围大(Date-Time代替Date)(16)

原理很简单,互相通过Instant为跳板即可.

今天的课程就到这里了.其实Date-Time的魅力不止于此,大家可以尽情去发掘应用.

捅抱新技术,畅想美好!

,