Joda-Time Instant 时间瞬间
2018-11-24 本文已影响28人
ba2cb747365a
背景:
本故事将介绍Joda-Time的一个基础对象,Instant瞬间,刚开始如果没有看源码的话,可能对这个对象概念不好理解,本故事就来揭示一下Instants到底是什么。
补充:
通过对核心对象的源码分析,结合代码案例会很快理解框架的本质。
核心对象
Instants
- Joda-Time中最常用的概念是瞬间。 Instant被定义为时钟系统的一个时刻,指定为1970-01-01T00:00Z的毫秒数。Joda-Time之所以可以和JDK协作,就是因为时钟系统是一样的。说白了是时钟毫秒值。它是时间系统的最底层的概念。
- 在Joda-Time中,DateTime就是Instant的一个具体实现对象,也是开发中最常使用的Api。DateTime是不可变的,因此是线程安全的。
MillisProvider
-
这个接口是底层时钟毫秒的获取接口,说白了是从系统时钟中拿到当前毫秒值。
image.png - 这个接口有三个实现,如下:
1.SystemMillisProvider
2.FixedMillisProvider
3.OffsetMillisProvider -
这里我们只关注默认的SystemMillisProvider,如下:
image.png - 看到这里是不是发现了熟悉的东西,开发中常用的System.currentTimeMillis();,也就是时钟毫秒值。
示例
-
如何将Instant转换成日期时间对象DateTime
image.png
先来看一下Instant的构造方法
image.png - 先是调用了父类的构造方法,父类直接调用了Object构造方法。
-
重点是DateUtils.currentTimeMillis()赋值给了iMillis这个属性
那么DateUtils.currentTimeMillis()里面做了什么事情呢?
image.png - 见上图,说白了就是调用MillisProvider获取毫秒值,默认的就是我们熟知的SystemMillisProvider。
通过上面的分析,可以理解Instant就是毫秒值的一个包装对象,那Instant又是如何转换为DateTime的呢?
-
上期我们知道了DateTime是毫秒值和日历计算引擎的组合。Instant已经有毫秒值,只要加入一个日历计算引擎就好了,下图是源码:
image.png -
相信看到这里已经看明白了,Instant为什么叫时钟瞬间,以及它是依靠时钟毫秒值与DateTime协同工作的。
总结
通过几个故事,理解Joda-Time,首先需要记住三个核心对象:
- Instant(时钟瞬间),它是时钟的一个瞬间的毫秒值。
- Chronology(日历系统/计算引擎) 它代表了某个日历系统。比如格里高利日历系统,ISO日历系统。
- TimeZone (时区)同一个时钟毫秒值放到不同的时区,时间也是不一样的。最简单的例子就是改一下windows系统的时区,你的时间也变了,但是电脑里面的时钟毫秒值是没变的。