Joda-Time Chronology年表
背景:
本故事将介绍Joda-Time 的核心对象Chronology,中文翻译是年表。Joda-Time的设计是围绕着这个对象来进行的,所以想深挖框架,先要看看这个类。
补充
以后会贴出源码来辅助理解框架
核心对象
Chronology
Joda-Time的时间设计是基于年表的。它是一个计算引擎,支持日历系统的复杂规则。它封装了字段对象,这些字段对象可以按需的将绝对时间瞬间分割为可识别的日历字段,如“星期天”。它实际上是一个可插拔的日历系统。根据日志的不同标准,它有不同的日记系统实现。
源码验证:
-
我们来看下核心API DateTime的构造方法
image.png -
可以看到是使用父类来构造,再来看父类的构造干了什么
image.png -
是不是有点熟悉,第一个参数就是当前时间毫秒值,说白就是System.currentTimeMillis()。第二个就是ISO日历系统的计算引擎。可以这么理解,Chronology是一个日历系统的计算引擎,它将毫秒值计算成了日期时间。
image.png - 哈哈,这不就是ISO日历+上海东八区时区吗,时区后面再介绍
- ISO日历详见百度百科:https://baike.baidu.com/item/ISO%208601/3910715?fr=aladdin
Property
Property将DataTime和DataTimeField组合起来,提供更强大的方法。
DateTimeField
-
简单理解就是计算引擎,例如可以计算今天是星期几,哪个月份,那一年。举一个算今天星期几的例子
image.png -
通过上面的介绍,我们已经知道DateTime是毫秒值和日历计算引擎组成的,来看一下dayOfWeek方法,它返回的是上面我们说的Property。
image.png -
通过源码可以看到,Property确实是由DateTime和DataTimeField组成的。
-
那么Property是怎么转换成中文的星期五的呢,继续往下看
image.png -
观察上图,getField()就是DataTimeField,第一个参数是毫秒值(从DateTime中获得),第二个是语言。说白了DateTimeField就是一个计算引擎,把毫秒值计算成星期,Locale就是国际化的对象。比如汉字是星期五。那么英文呢,我们来实践一下:
image.png -
可以看到成了Fri,就是英文的星期五。
总结
- 通过分析源码可以看到,System.currentTime获取到的毫秒值是一个趋势递增的数字,所以我们可以通过它来计算耗时,以及两个时间的新旧。
- Chronology 一方面包含了日历标准,另一方面是计算引擎,实际上是一个日历系统,提供了毫秒值和日历系统的相互换算。
- 最后说明一句:Chronology虽然是Joda-Time设计的关键,但它不是使用API的关键。那什么是使用API关键呢,就是DateTime,它封装了Chronology和毫秒值,提供出简单易用的API。