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个月 } |