漫话:如何给女友解释为何日本时间比中国时间快一个小时

立刻就要五一劳动节放假了,忙碌了半年,准备趁着假期出去放松放松,因而开始准备行程。女友据说日本5月份能够看樱花,因而她在看去日本的航班。我在旁边默默的看了下个人信用卡额度。bash

如上图,飞机13:40从杭州萧山机场起飞,17:50在东京成田机场降落。可是实际上,飞机整个航行确实只飞行了3小时10分。

由于日本时间比中国时间早一个小时。日本的17:50至关于国内的16:50。飞机实际上只飞了3小时而已。spa

时区

好久之前,在没有钟表的年代,人们经过观察太阳决定时间,一开始人们根据太阳挂在天空的位置来大体的肯定时间,慢慢的人们根据太阳照射到的物体投下的影子来肯定时间。操作系统

如古代人们使用的日晷,就是人类古代利用日影测得时刻的一种计时仪器。3d

在一天中,被太阳照射到的物体投下的影子在不断地改变着:

第一是影子的长短在改变。早晨的影子最长,随着时间的推移,影子逐渐变短,一过中午它又从新变长;指针

第二是影子的方向在改变。在北回归线以北的地方,早晨的影子在西方,中午的影子在北方,傍晚的影子在东方。从原理上来讲,根据影子的长度或方向均可以计时,但根据影子的方向来计时更方便一些。故一般都是以影子的方位计时。code

随着时间的推移,晷针上的影子慢慢地由西向东移动。移动着的晷针影子好像是现代钟表的指针,晷面则是钟表的表面,以此来显示时刻。cdn

可是,因为地球的自转,这就使得不一样经度的地方的时间有所不一样(地方时)。东边的地点比西边的地点先看到日出,东边地点的时刻较早,西边地点的时刻较晚。对象

世界各个国家位于地球不一样位置上,所以不一样国家,特别是东西跨度大的国家日出、日落时间一定有所误差。这些误差就是所谓的时差。blog

为了照顾到各地区的使用方便,又使其余地方的人容易将本地的时间换算到别的地方时间上去,1863年,人们首次提出了时区的概念。get

有关国际会议决定将地球表面按经线从东到西,划成一个个区域,而且规定相邻区域的时间相差1小时。

在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域,就将本身的时钟校订1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。

就像咱们若是去日本旅游,咱们的手表时间显示的是中国时间,为了适应当地的时间,就须要将其校订一个小时。

现今全球共分为24个时区。

格林威治时间

咱们说中国在时区上是东八区,通常用GMT+8来表示,日本是东九区,通常用GMT+9来表示。

其实就是说中国时间是在GMT时间的基础上加8个小时,而日本时间是在GMT时间的基础上加9个小时。因此日本时间会比中国时间快一个小时。

那么到底什么是GMT呢?

GMT是Greenwich Mean Time的缩写,即格林威治时间(格林尼治平时),是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,由于本初子午线被定义为经过那里的经线。

自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。国际天文学联合会于1928年决定,将由格林威治平子夜起算的平太阳时做为世界时,也就是一般所说的格林威治时间。

因为地理位置不一样,中国和日本分属于不一样的时区,采用的时间标准也就不一样。而规定中相邻的时区中时间间隔是1小时,又因为中国属于东八区,日本属于东九区,因此中国时间是GTM+8,日本时间是GMT+9,因此,日本时间比中国时间快一个小时。


理论时区与法定时区

理论时区以被15整除的子午线为中心,向东西两侧延伸7.5度,即每15°划分一个时区,这是理论时区。

理论时区的时间采用其中央经线(或标准经线)的地方时。因此每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。东边的时区时间比西边的时区时间早。

可是,各个国家和地区具体采用哪一个时区实际上是本身能够决定的,理论时区只是建议性的。为了避开国界线,有的时区的形状并不规则,并且比较大的国家以国家内部行政分界线为时区界线,这是实际时区,即法定时区

例如,中国幅员宽广,在理论时区上,差很少跨5个时区,包括东五区、东六区、东七区、东八区以及东九区。若是严格按照地理划分的话,那么乌鲁木齐的时间可能和黑龙江的时间相差四个小时。

可是,为了方便管理和使用,中国的法定时区以东八时区的标准时即北京时间为准。因此,中国时间俗称北京时间。

好处天然不言而喻,你们统一使用同一个时间,就是比较方便。缺点也比较明显,就是一样是早上四点,有的地区天已经亮了,可是有些地方仍是黑的。

虽然本文介绍的中国和日本这两个国家都是使用惟一法定时区的。可是,仍是有不少国家并非使用统一的时区的。

如美国各州的时区,基本上按地理位置,也就是经度区分的,也许美国是执行的最标准者之一。

战斗民族俄罗斯的时区也并不统一,好比处在几乎差很少为止的叶卡捷琳堡和鄂木斯克就执行了两个时区。这种状况大多数和历史有关。

代码中获取不一样时区的时间


Java中使用TimeZone 表示时区偏移量。TimeZone对象给咱们的是原始的偏移量,也就是与GMT相差的微秒数,即TimeZone表示时区偏移量,本质上以毫秒数保存与GMT的差值。

获取TimeZone能够经过时区ID,如"America/New_York",也能够经过GMT+/-hh:mm来设定。例如北京时间能够表示为GMT+8:00。

当咱们想要输出美国洛杉矶时间时,能够选择这种方式:

TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Date date = new Date();
System.out.println(date);
复制代码

须要注意的是,如下代码是没法得到美国洛杉矶时间的:

System.out.println(Calendar.getInstance(TimeZone.getTimeZone("America/Los_Angeles")).getTime());
复制代码

由于当咱们使用System.out.println来输出一个时间的时候,他会调用Date类的toString方法,而该方法会读取操做系统的默认时区来进行时间的转换。只有修改了默认时区才会显示该时区的时间。

可是,经过阅读Calendar的源码,咱们能够发现,getInstance方法虽然有一个参数能够传入时区,可是并无将默认时区设置成传入的时区。

而在Calendar.getInstance.getTime后获得的时间只是一个时间戳,其中未保留任何和时区有关的信息,因此,在输出时,仍是显示的是当前系统默认时区的时间。

Java8提供了一套新的时间处理API,这套API比之前的时间处理API要友好的多。

Java8 中加入了对时区的支持,带时区的时间为分别为:ZonedDate、ZonedTime、ZonedDateTime。其中每一个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式,如Asia/Shanghai、America/Los_Angeles等。

在Java8中,直接使用如下代码便可输出美国洛杉矶的时间:

LocalDateTime now = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
System.out.println(now);
复制代码

相关文章
相关标签/搜索