最近项目上遇到了夏令时的问题,于是就对夏令时进行了分析研究,下面和大家一起分享一下,并在文章最后用Javascript代码来判断当前某一时区的某个特定时间是否属于夏令时。

javascript计时器什么时候关闭(三分钟科普夏令时)(1)

什么是夏令时?

夏令时(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。

与夏令时(Daylight Saving Time:DST)相对的就是标准时间(Standard Time),在美国的表示方法,如东部标准时间(Eastern Standard Time;简写EST)。现在主要在下面的这些国家和地区实行。

在实施夏令时的国家或者地区,每年春天的3月份的第2个星期天到每年秋天的11月份的第1个星期天属于夏令时。

  1. 标准时间结束,进入夏令时

进入夏令时时,时钟往后拨一个小时,直接从1点变到3点,也就是说我们要比原来提前一个小时和美国佬开会。

夏令时和时区的关系?

因为夏令时不是在世界上所有的国家都实行,因此,即使属于同一个时区的不同国家和地区,如果其中一个国家进入了夏令时,另外一个国家没有进入,这段夏令时时间段内,即使时区是一样的,但是其时间是不一样的。

下面的表格是笔者的测试结果:

序号

时区

是否应用了夏令时?

1

UTC-9(Alaska)

Y

2

UTC-8(Canada&US)

Y

3

UTC-6 (Easter IsLand)

N

4

UTC-5 (Eastern Time (US&Canada))

Y

5

UTC-5 (Indiana(East))

Y

6

UTC-5 (Bogota, Lima, Quito, Rio Branco)

N

7

UTC-4 (Atlantic Time(Canada))

Y

8

UTC-5 (Chetumal)

N

从上表可以看出,Bogota, Lima, Quito, Rio Branco等国家和地区,即使也是属于UTC-5,但是其就是不实行夏令时。

那笔者是如何测试出来的,其实很简单,打开你的操作系统,点击桌面右下方的时间管理,就可以自己调整时区和时间来测试了,如下图所示意,当笔者选择的时区为UTC-5(US&Canada)的时候,如果在2018年3月11日,强制把时间改成2018年3月11日,2:53:40 AM是改不成功的,因为,这个时间点在UTC-5(US&Canada)压根就不存在,是不是涨知识了?

javascript计时器什么时候关闭(三分钟科普夏令时)(2)

为什么有夏令时?中国有吗?

Daylight Saving Time,翻译成中文就是,日光节约时间,最早是1895年新西兰推出的,主要是节省当时的用电量,一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。

夏时制”的核心理念,就是充分利用日光照明,减少用电,从而节约能源。夏天日照时间长,在不更改作息时间的前提下,把“时间”提前,可以早早地利用阳光。

其实在中国也实施过夏令时,1986年5月4日凌晨两点整,在西单的电报大楼,工作人员将顶楼报时钟的表针拨向了三点。同时,中央人民广播电台传出了报时:“北京时间,三点整。”,但是后来由于现实原因,没有继续实施,具体原因,请读者自行搜索度娘,笔者就不在赘述。

Javascript如何判断当前是否是夏令时?

在Javascript有一个非常有用的时间对象,Date。

javascript计时器什么时候关闭(三分钟科普夏令时)(3)

我们可以通过调用其方法getTimezoneOffset(),获得时区的偏移量(相对于GMT(标准时区)时间),其单位是分钟。

javascript计时器什么时候关闭(三分钟科普夏令时)(4)

如果要换算成小时的偏移量,则需要除以60.

javascript计时器什么时候关闭(三分钟科普夏令时)(5)

其偏移的量,在实施夏令时的国家和地区,在不同的月份返回值可能不是完全一样的。比如说,在一个实施夏令时的国家和地区,在每年的1月份和7月份,其时区偏移量返回值肯定是不一样的。

javascript计时器什么时候关闭(三分钟科普夏令时)(6)

getTimezoneOffset() 方法将会返回相对标准时区的时间偏移量(单位为分钟),并符号取反。比如,GMT-5(US&Canada),在2018年的1月份, getTimezoneOffset()将会返回300而不是-300;在2018年的7月份,getTimezoneOffset()将会返回240.

jan.getTimezoneOffset() = 300

jul.getTimezoneOffset() = 240

javascript计时器什么时候关闭(三分钟科普夏令时)(7)

当我们拿当前时间的当前时区偏移量和上面的1月份和7月份中的最大值进行比较,如果当前时区偏移量小于其最大值,我们认为当前就进入下了夏令时,是不是很神奇,学习知识和学习程序两不误。

javascript计时器什么时候关闭(三分钟科普夏令时)(8)

读者如果感兴趣的话,可以把上图中的代码写到一个Javascript文件中,通过不断的调整你本机的时区和时间,然后在刷新浏览器,看是否会有夏令时的javascript消息框弹出。

读者如果遇到任何问题,请关注我的今日头条自媒体号,并在文章下面留言,我会尽可能第一时间回复大家。

【部分图片来源于网络,如果侵权,请与我联系删除】

,