10.4小节所介绍的LocalDateTime类对象可以代表一个时间点,但严格的说,这个对象所代表的时间点并不精确,这是因为对象中并不包含时区信息。例如北京时间的2022年6月1日早上8点和法国巴黎时间的2022年6月1日早上8点并不是同一个时间点。因此仅靠“2022年6月1日早上8点”,人们并不能准确的知道这是哪一个时间点。如果希望精确的描述一个时间点,日期时间对象中就必须包含时区信息。
Java8新日期时间系统中专门定义了表示时区的类,这个类的名称叫做ZoneId。ZoneId是一个抽象类,它有两个子类,分别是ZoneRegion,另一个子类叫做ZoneOffset。为什么要定义ZoneRegion和ZoneOffset两个类来表示时区呢?这是因为人们可以通过两种方式来定义时区。
第一种方式是通过城市或地区来定义时区。世界上有很多城市和地区,这些城市或地区都处在某个特定的时区当中,因此如果指定了一个城市或地区,就能确定它所在的时区。ZoneRegion就是代表城市或地区的类,当一个ZoneRegion类对象被创建后,ZoneRegion类对象所代表的那个城市或地区的时区也会被确定,所以说一个ZoneRegion类对象就代表一个时区。
第二种定义时区的方式是指定时差。我们知道:全球共分为24个时区,人们把英国格林尼治时间天文台所在的那个时区称为“零时区”或“中时区”,其他各个时区与零时区都有时差。因此只需要指出与零时区的时差,也能确定一个时区。ZoneOffset就是代表时差的类