JavaSE8-The New Date and Time API(1)

      时间流逝,就像一支弓箭。我们很容易设置一个开始,并向前或向后以秒为单位计数。这样说来的话,为何处理时间如此难呢?真正的问题在于人。如果我们可以简单地告诉别人:“在1371409200秒这个时间来见我,不要迟到了”,所有的问题都变得很简单。但是我们想把时间和白昼,季节相关联起来,这才是使事情复杂起来的原因所在。Java1.1有一个日期类,事后看来非常的幼稚,随着Java1.1中Calendar类的出现,里面大部分的方法都被弃用。它的API不是很好,实例是可变化的,它不用跳动的秒来处理事务。第三次的改变在Jave8,Jave.time API出现,它纠正了过去的缺陷,将在很长一段时间为我们服务。在本章,你将学习为何时间运算如此繁琐,新的日期和时间API如何解决这些问题。

本章要点:

1.所有java.time对象是不可变

2.Instant(瞬时)是时间边界的一个点(类似Date)

3.Java中,每天有86400秒

4.两个instant的不同之处在于他们持续间隔的时间

5.LocalDateTime没有时间时区信息

6.TemporalAdjuster方法处理常见的Calendar运算,比如查找一个月中第一个星期二

7.ZoneDateTime是给定时区的一个时间点(类似于GregorianCalendar)

8.增加时区时间时,为了保存白天时间变化,实用Period,而不是Duration

9.用DateTimeFormatter来格式化和转换日期和时间

5.1 时间边界

历史上,基本的时间单元秒,起源于地球围绕轴线的旋转。一次公转需要24小时或24*60*60=86400秒。看起来,似乎这是一个天文上的测定,来精确定义秒。不幸的是,地球存在轻微的摆动,所以需要更精确的定义。在1967年,对于秒的新的精确定义出现,它起源于铯放射性元素的原子的本质属性,并且和历史上的定义匹配。从那以后,官方时间以原子钟网络来定义。

偶尔,官方时间维护人员需要同步绝对时间,以和地球旋转一致。首先,官方的秒是轻微矫正过的,从1972年开始。跳动的秒偶尔被加进去。(理论上,1秒有时需要被减掉,不过此前这还没有发生过)有一个改变系统的讨论。显然,跳动的时间是个痛点。许多计算机系统实用“矫正”的方式来保证一天86400秒,即在跳动的秒数出现前,人工的变快或变慢。这种方式之所以有效是因为计算机上的本地时间并不是总是很精确,许多计算机用外部的服务来同步本地时间。

Java的日期时间API需要Java实用以下时间范围:

1.一天有86400s

2.每天中午和官方时间精确匹配

3.以一种精确定义的方式,严密地匹配该时间

以上给予Java一定的灵活性来适应未来官方时间的变化

在Java中,Instant代表时间边界的一个点。开始时候,纪元是被任意设定在1970年1月1日凌晨,此时子午线穿过位于伦敦的格林尼治皇家天文台。在Unix或POSIX时间里使用同样的惯例。从那以后,时间被定为一天86400秒,以纳秒的精度向前或向后计算。Instant值向前追溯到十亿年前遥远(即Instant.MIN),它不足以表示宇宙的诞生时间(大约130.5亿年前左右),但在实际应用中足够了。毕竟,十亿年前,地球被冰雪覆盖,居住着今天动植物的祖先,他们在显微镜下才能看到。最大值是Instant.MAX,是1000,000,000年12月31日.静态方法Instant.now()表示当前时间。你可以像往常一样用equals和compareTo方法比较当前时间,这样的话,你可以把instant当做时间戳。

为了找到两个Instant的不同,使用静态方法Duration.between.以正在运行的时间算法来举例说明

Instant start = Instant.now();
runAlgorithm();
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
long millis = timeElapsed.toMillis();
Table 5–1Arithmetic Operations for Time Instants and Durations
Method Description
plus, minus:          

Adds a duration to, or subtracts a durationfrom, this Instant or Duration.
plusNanos, plusMillis, plusSeconds,plusMinutes, plusHours, plusDays:
 Adds a number of the given time units to thisInstantorDuration.
minusNanos, minusMillis, minusSeconds,minusMinutes, minusHours, minusDays:
Subtracts a number of the given time unitsfrom thisInstantor Duration.
multipliedBy, dividedBy, negated:

Returns a duration that is obtained by multiplying or dividing thisDurationby a ,givenlong, or by –1. Note that you can scale,only durations, not instants.
isZero, isNegativ:
Checks whether thisDurationis zero or negative.

Duration是两个Instant的时间差,你可以计算出Duration用常见的单位,比如纳秒,毫秒,秒,分,时,天等

Durations需要多个long类型的值在内部进行存储。秒数被存储到一个long类型中,纳秒被存到其他的int类型中。如果你需要以纳秒的精度进行运算,你需要Duration的全部变化范围。你可以用下表的方法,反之,直接用toNanos()以long类型精度进行运算即可。

NOTE:纳秒填充long需要300年


比如你想验证一个算法比其他算法快十倍,可以用以下方式:

Duration timeElapsed2 = Duration.between(start2, end2);
boolean overTenTimesFaster =
timeElapsed.multipliedBy(10).minus(timeElapsed2).isNegative();
// Or timeElapsed.toNanos() * 10 < timeElapsed2.toNanos()


注意:Instant和Duration类是不可变的(final?),所有的方法将会产生新的实例





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值