Javascript 的时间格式问题

先上代码:
1
2
3
4
5
6
7
8
9
10
> new Date("2015-07-08")
< Wed Jul 08 2015 08:00:00 GMT+0800 (中国标准时间)
> new Date("2015/07/08")
< Wed Jul 08 2015 00:00:00 GMT+0800 (中国标准时间)
> new Date("2015 Jul 08")
< Wed Jul 08 2015 00:00:00 GMT+0800 (中国标准时间)
> new Date("2015 Jul 08 GMT+400")
< Wed Jul 08 2015 04:00:00 GMT+0800 (中国标准时间)
> new Date("2015-07-08 GMT+400")
< Wed Jul 08 2015 04:00:00 GMT+0800 (中国标准时间)
再说结论:

在 Javascript 中,当为某个变量只赋值日期时,会默认使用该日期的 0 点 0 分 0 秒作为完整的值。而根据表现格式的不同,在具体赋值时会使用不同的时区时间赋值。

当使用『-』作为年月日的分隔,即 YYYY-MM-DD 的格式时,赋值会根据 GMT/UTC 时间的当日 0 点赋值,再根据浏览器提供的系统时间,折算为当地时间。也就是说,如果你在北京,并且电脑时区正常。那么当你为某变量赋值『今天』时,实际上赋的值是 0 时区的 0 点 0 分 0 秒,换算成北京时间为早上 8 点。如果在东京,则是早上 9 点。

也就是说,无论是在哪个时区,相同的一套代码在不同的电脑上,会得到相同的值。

而当使用『/』作为年月日的分隔,即 YYYY/MM/DD 的格式时,赋值则根据电脑时间,取到本地时间该日的 0 点 0 分 0 秒。由于各时区都差一个小时整,实际上会导致 JS 代码在不同时区电脑上执行相同代码时,得到的时间值在绝对值上并不相等。即在北京时区时,会取到北京时区的 0 点 0 分 0 秒,同一时刻在东京则已经是当日 1 点 0 分 0 秒了。

换句话说,不同客户端执行相同代码会取得不同的值。

但即使如此,两者也有表现相同的时候。只要在赋值时就明确指定时区,则两者的值可以是相同的。例如:

1
2
3
4
> var a = new Date('2015-07-01 GMT+800')
> var b = new Date('2015/07/01 GMT+800')
> a.getTime() == b.getTime()
< true

同时,无论是哪种情况,当通过 JS 转换成时间戳时,其值都是相同的。原因在于时间戳本身的定义,就是指当前时间距 0 时区的 1970 年 1 月 1 号 0 点 0 分 0 秒的秒数。所以在执行环境中,函数会根据电脑的时区设置来加减相应的小时数,先转换为 0 时区,然后再进行时间距离的计算。

参考:

http://www.w3schools.com/js/js_date_formats.asp