美文网首页Joda time
Joda-Time Chronology年表

Joda-Time Chronology年表

作者: ba2cb747365a | 来源:发表于2018-11-23 21:52 被阅读127次

    背景:

    本故事将介绍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。

    相关文章

      网友评论

        本文标题:Joda-Time Chronology年表

        本文链接:https://www.haomeiwen.com/subject/pvesqqtx.html