http://blog.163.com/cui_zhouyang/blog/static/703397212009624210044/
Date对象存储日期和时间,本来十分简单,并无大书特书之必要。不过,如果考虑了时区问题,那么小小的Date对象同样蕴藏着玄机。
何谓时区问题呢?如果你对时区这个词比较陌生,那么你是否听说过“倒时差”呢?比如,从北京飞到华盛顿,那么也许你要面临的第一个痛苦的问题就是“倒时差”。话说,北京在东八时区,而华盛顿在西五时区,两地的时间差是13个小时。也就是说,北京的晚上10点正好是华盛顿同一天的早上9点钟。(如果是美国夏时制的话,那么相差12个小时,美国的时间老复杂了,我也闹不明白。很惭愧的说,俺打小就在天朝呆着,至今还没有出过国门呢,完全没有倒时差的机会哈^_^。在下面的讨论中,也将忽略美国夏时制)。
现在我们明白了同一时间点在不同时区的显示是完全不同的,那么Date对象是如何应付这个问题的呢?要弄明白这个问题,首先必须清楚Date对象的以下三个概念:
1. 本地时间(Local Time)
本地时间顾名思义就是你所在的时区的时间。像我身在北京,那么我的本地时间就是东八时区的时间。不过,前提条件是,你的系统时间与你本地的时间是一致的。说白了,Date对象不可能从我口里知道我身在北京,它只能从我的操作系统时区信息了解我的位置。所以,如果我修改了自己的系统时间,例如采用美国的西五时区,那么对Date对象而言,它就认为我的本地时间是西五时区的时间了。
现在是北京时间2008年10月16日晚上9点31分42秒,如果你想生成一个Date对象反映当前的时间,那简直太容易了,一个不带任何参数的构造函数就可以办到:
var date:Date = new Date();
如果你不太关心分钟和秒钟,希望生成的Date时间中这两个值都置零,那么你可以这样做:
var date:Date = new Date(2008, 9, 16, 21);
注意了,今天是10月16日,但是传给构造函数的第二个参数却是9。这是因为Date对象中一月份用数字0表示,以此类推,10月份就应该是数字9了。同样,你要得到当前的日期和时间:
var str:String = date.toLocaleString();
str字符串的返回值是:“Thu Oct 16 2008 09:31:42 PM”。
2. 协调世界时(UTC Time)
协调世界时等同于零时区的时间。零时区包括以本初子午线为基准,东西经度各为7.5°范围内的地区。Date对象中任何关乎UTC Time的属性或者方法,它们的名字中都包含了字段“UTC”,因此非常容易辨识。想知道北京时间2008年10月16日晚上9点31分42,用世界时间表示是几点几分吗?
var str:String = date.toUTCString();
str字符串的返回值是:“Thu Oct 16 13:31:42 2008 UTC”。没错,零时区比北京时间早了8小时。
3. 时区差(timezoneOffset)
Date对象不仅储存了日期和时间信息,更储存了时区信息。Date对象的timezoneOffset属性,反映了你的本地时间和协调世界时之间相差多少分钟。这个属性值是只读的,它是由系统时间决定的。我的电脑上生成的Date对象,它们的timezoneOffset属性值一律是-480,这说明了北京时间晚于零时区时间480分钟。
如果,你希望通过一个字符串生成一个Date对象,那么请记住,这个字符串中最好带有时区信息,否则的话,生成的Date可能不是你期望的时间。例如,我修改了自己的系统时区为西五时区,这样的话,“Thu Oct 16 2008 09:31:42 PM”生成的Date对象将不再代表北京时间2008年10月16日晚上9点31分42秒,而只是华盛顿时间2008年10月16日晚上9点31分42秒。不过,如果字符串中包含了时区信息GMT+0800,“Thu Oct 16 2008 09:31:42 PM GMT+0800”,那么不论在任何情况下,生成的Date对象都将代表北京时间2008年10月16日晚上9点31分42秒。在将Date对象转换成字符串时,如果希望保留时区信息,那么请使用:
var str:String = date.toString();
说了这么多,相信你对时区一定有了更好的认识。是的,Date真的很简单,如果我们在使用和转换Date的时候,考虑了时区问题可能产生的影响,那就更好了。最后,我想推荐你在将Date对象转换成字符串时,请使用toString()方法,因为,它会一丝不苟的记录下时区信息。
UTC时间 = 本地时间 + 差值.