卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法( 八 )


卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法一个总秒数和一个偏移量Id 。 其本质就是偏移的秒数 , 但是直接用秒数在有些时候不够人性化 , 所以还给了个字符串类型的Id , 它的格式如下图22:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法这种格式比较友好、比较直观 , 但最后还是要给算成一个总秒数 。 算是换了一种好的表达方式吧 。 Instant类揭秘 , 先看它的存储字段 , 如下图23:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法一个秒数和一个纳秒数两个字段 。 这两个字段的值就是从系统当前经过的“毫秒数”里算出来的 。 所以它是一个时刻 , 就是一瞬间的意思 。 系统当前默认时刻的获取方法 , 如下图24:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法可以看到是UTC的时刻 , 即0时区的时刻 。 再次说明全世界任何地方的时刻都是一样的 , 而时间的不同就是因为时区的不同造成的时间偏移量不同 。 Duration类揭秘 , 先看它的存储字段 , 如下图25:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法一个秒数和一个纳秒数两个字段 。 这两字段存储的是一段时间(也称时长) , 所有这个类表示一段时间 , 这段时间可以是正的 , 也可以是负的 。 Period类揭秘 , 先看它的存储字段 , 如下图26:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法一个年数、一个月数和一个日数三个字段 。 这个类也表示一段时间(也称时长) , 只不过它是以对人类有意义的方式来存储 , 比如截止到今天 , 我已经工作了10年9个月6天啦 。 Duration类和Period类都表示一段时间 , 除了表达方式上的不同之外 , 还有一个重要的点 , Duration类在进行加减的时候 , 都是加减的精确时间 , 比如1天就是24小时 。 Period类在进行加减的时候 , 加减的都是概念上的时间 , 特别是在时区调整的时候 , 它会维持当地时间的合理性 , 而Duration类则不会 。 比如夏令时到来 , 在时区即将提前1一个的时候 , 在18:00的时候加上1天 , 如果是Period类 , 则加完后是第二天的18:00 , 他会自动处理时区提前产生的裂缝 。 如果是Duration类 , 则加完后是第二天的19:00 , 它是精确的加上了24小时 , 又由于时区提前产生了1小时的裂缝 , 因此等于加上了25小时 。 Period类的年数/月数/日数三个字段之间 , 互相不影响 , 每个都可以随意的为正数或负数 。 Year类只存了一个年份、YearMonth类只存了年月、MonthDay类只存了月日 , 这些都是在特定情况下会用到的类 , 它们的情况和大多数人理解的一样 。 常用的时间操作如果要获取当前时间的话 , 用的都是now()方法 , 默认是本地时区 , 也可以指定别的时区 , 如下图27:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法如果要从指定的数据构建的话 , 用的都是of()方法 , 如下图28:
卜娃娃|最硬核的「Java8时间系统」设计原理与使用方法如果要从字符串解析的话 , 用的都是parse()方法 , 如下图29: