8.3.3 GMT、UTC和本地时间
时间从宇宙诞生之日起就存在,时间也和我们现在的生活息息相关。在软件系统中更是经常会处理和时间相关的问题。如果读者使用的是Windows操作系统,会在任务栏的右边显示当前的时间。这个时间一般就是用户所有国家或地区的本地时间。
由于地球自转的原因,产生了24个时区。也就是说,将地球按经度划分,每15度是一个时区。每相临的两个时区相差1个小时。这就会带来一个非常大的问题。由于世界不同的国家或地区分布在不同的时区中,因此,各地的本地时间是不同的。如地区A的本地时间是22:00,而地区B的本地时间是12:00。这就相当于地区A已经是晚上了,而地区B刚到中午。在对于同一个时区的活动基本不会有影响。但不同时区由于时间不统一,有可能会造成时间混乱。
假设有一个面向全球用户的Web系统。服务端在美国洛杉矶,而在韩国也有该Web系统的用户。对于韩国的用户来说,系统当前显示的时间是韩国的本地时间。正好该系统需要用户录入日期和时间,并将用户录入的日期和时间保存在服务端的数据库中。在韩国的用户肯定录入的是韩国本地的时间。而这时法国的用户要浏览韩国用户录入的数据。但法国的用户看到的是韩国本地的时间,而由于时区不同,韩国的本地时间在法国又是另外一个时间。因此,法国用户必须将该时间转换成法国本地的时间。这虽然从理论上完全可行,但是对于大多数用户来说,自己进行时间转换相当不现实。
既然不能让用户自己来进行时间转换,那这个工作就只好由Web系统来完成了。最理想的效果是无论哪一个国家或地区的用户浏览网页时,系统都会显示本地的时间。要想达到这个目的,最简单的方法就是有一个参照物。就象这个世界上存在着各种货币,由于这些货币的汇率不同,就需要找到一种货币,并这种货币世界标杆,其他的所有货币的汇率都相对于这种世界货币。这种世界货币就是美元。
就象从若干种货币中选中一种货币作为世界货币一样。由于地球分为24个时区,因此,就需要从这24个时区中选中一个时区作为标准时区,其他时区都根据这个标准时区的本地时间加上或减去整数个小时,就可以得到当前时区的本地时间了。
在1884年美国华盛顿召开的国际大会上通过的协议选中了英国伦敦伦敦泰晤士河南岸的一个叫格林威治小镇所在的时区作为标准时区。这个时区的本地时间被称为格林威治时间,简称GMT(Greenwich Mean Time)。其他时区的本地时间都在GMT时间的基础上加或减去若干个整数小时。如北京的本地时间是GMT+8,也就是说,如果GMT时间是2008年10月20日 11:20:12,那么北京时间就会在这个时间的基础上加8个小时,也就是2008年10月20日 19:20:12。由于某些地区实行夏令时,因此,在实行夏令时的地区的本地时间还需要加1小时。在英国伦敦每年4月到10月实行夏令时,因此,在4月到10月,北京时间和伦敦时间差了7个小时,而不是8个小时。而1至3月、11月和12月北京时间和伦敦时间差了8小时。因此,在前面的伦敦时间2008年10月20日 11:20:12对应的北京时间应该是2008年10月20日 18:20:12。
如果读者使用的是Windows操作系统,可以在【日期和时间 属性】对话框的【时区】页中将当前时间设为伦敦时区,如图8.16所示。
图8.16 设置当前时区
如果读者的机器在设置时区之前是的时间是北京所在的时区(GMT+8),并且月份在4月至10月之间,在设置完时区后,会发现任务栏右边的时间减了7小时。如果是其他的月份,则会减8小时。
由于地球自转轴和轨道角度的影响,GMT时间往往和世界标准时间有一些偏差,因此,需要使用世界协调时间进行修正,这种时间就叫UTC(Coordinated Universal Time)。虽然GMT和UTC存在着一定的偏差,但这种偏差很小。因此,在通常情况下,可以将GMT和UTC视为同一个时间。
从上面的描述可知,伦敦的格林威治镇的本地时间(GMT)被作为其他时区本地时间的参照时间,其他时区的本地时间都相对于GMT加或减若干个整数小时。如北京所在的时区是东八区(GMT+8),因此,北京时间要比伦敦时间快了8个小时(夏令时快了7小时)。UTC虽然和GMT有一定的偏差,但通常将两个时间看作同一个时间。在实际的系统中,如果保存在服务端的时间需要为不同时区的用户服务,最好直接保存GMT,当不同时区的用户要查看保存在服务端的时间,系统再根据用户所在的时区将时间自动转换成用户本地的时间。