JavaSE进阶

2、瞬时:Instant

Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。

java.time包通过值类型Instant提供机器视图。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

 

时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

public static void main(String[] args) {

Instant t = Instant.now();

System.out.println(t);

//偏移8个小时

OffsetDateTime atOffset = t.atOffset(ZoneOffset.ofHours(8));

System.out.println(atOffset);

long milli = t.toEpochMilli();

System.out.println(milli);

Instant in2 = Instant.ofEpochSecond(10000000);

System.out.println(in2);

}

3、带时区的日期、时间的处理

作为一个开发者,如果不用去处理时区和它带来的复杂性,那是幸运的。java.time包下的LocalDate、LocalTime、LocalDateTime和Instant基本能满足需求。当你不可避免时区时,ZonedDateTime等类可以满足我们的需求。

ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。

  • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等
  • now():使用系统时间获取当前的ZonedDateTime
  • now(ZoneId):返回指定时区的ZonedDateTime

ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

  • getAvailableZoneIds():静态方法,可以获取所有时区信息
  • of(String id):静态方法,用指定的时区信息获取ZoneId对象

Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

public static void main(String[] args) {

Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();

for (String string : availableZoneIds) {

System.out.println(string);

}

ZonedDateTime t = ZonedDateTime.now();

System.out.println(t);

ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of("America/New_York"));

System.out.println(t1);

// Clock clock = Clock.systemDefaultZone();

Clock c = Clock.system(ZoneId.of("America/New_York"));

System.out.println(c.getZone());

System.out.println(c.instant());

}

4、持续时间:Duration

Duration:用于计算两个“时间”间隔

public static void main(String[] args) {

LocalDateTime t1 = LocalDateTime.now();

LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0);

Duration between = Duration.between(t1, t2);

System.out.println(between);

System.out.println("相差的总天数:"+between.toDays());

System.out.println("相差的总小时数:"+between.toHours());

System.out.println("相差的总分钟数:"+between.toMinutes());

System.out.println("相差的总秒数:"+between.getSeconds());

System.out.println("相差的总毫秒数:"+between.toMillis());

System.out.println("相差的总纳秒数:"+between.toNanos());

System.out.println("不够一秒的纳秒数:"+between.getNano());

}

5、日期间隔:Period

Period:用于计算两个“日期”间隔

public static void main(String[] args) {

LocalDate t1 = LocalDate.now();

LocalDate t2 = LocalDate.of(2018, 12, 31);

Period between = Period.between(t1, t2);

System.out.println(between);

System.out.println("相差的年数:"+between.getYears());//1年

System.out.println("相差的月数:"+between.getMonths());//又7个月

System.out.println("相差的天数:"+between.getDays());//零25天

System.out.println("相差的总数:"+between.toTotalMonths());//总共19个月

}