如何求得本地时区

GMT(格林尼治时间)几乎是等同于 UTC (协调世界时,是个标准时间)

更严格一点应该是GMT = UTC + 0,它刚好在0时区。所以计算本地时区的时候,只要能知道0时区的时间,自然就可以算出本地时区了。

lua的实现方法

lua的os.date ([format [, time]]函数,获得是UTC时间。默认是本地的UTC时间。

format参数如果 format 以 ‘!’ 打头,则返回的是0时区的时间。就是GMT时间。

1
local timezone = os.difftime(os.time() , os.time(os.date("!*t")))/3600

输出结果8.0,就是东八区。

python的实现方法

在python中,时区转换就很方便。如果是用上面的思路,先求本地时间,在求utc0时区时间。相减之后求时区。代码如下:

1
2
3
4
5
6
>> from datetime import datetime
>> t = datetime.now()
>> datetime.fromtimestamp(t.timestamp())
datetime.datetime(2021, 5, 11, 10, 14, 36, 297781)
>> datetime.utcfromtimestamp(t.timestamp())
datetime.datetime(2021, 5, 11, 2, 14, 36, 297781)

通过上面代码,可以看出同一个时间戳,在0时区和本地时区之间差了8个小时。正是我们的本地时区东八区。

不过python中获取时区的方法很多,最简单的就是这样:

1
2
3
4
5
6
7
>> import time
>> time.strftime('%z')
'+0800'
>> time.localtime().tm_zone
'CST'
>> time.localtime().tm_gmtoff/3600
8.0

CST就是中国标准时间。tm_gmtoff就是以秒为单位的UTC以东偏离的时间。

JavaScript的实现方法

而在JavaScript中获取时区就更简单了。

1
2
3
4
> d = new Date()
< Tue May 11 2021 10:47:34 GMT+0800 (中国标准时间)
> d.getTimezoneOffset()
< -480

这个返回的-480,就是本地时间与utc0时区的偏移时间,以秒为单位。但是为什么是负数呢?
因为它的计算公式是(0时区 - 本地时区) * 60min,因此的出的是负数。