夏令时相关


夏令时是什么?

说简单点就是人为调快时间1个小时。

欧洲的一些国家在3-10月份的时候,早上日出时间很早,到7,8点上班时间的时候,太阳可能都达到正午的那种太阳了,然后下午又3,4点就日落了;

这不符合日出而作,日落而息这样的规律,于是就用了夏令时这个解决办法,进入3-10月份,就人为的把时间调快1个小时。

造成的结果:比如东8和东7本来有1个小时的时间差,如果东7使用了夏令时,那就没有时间差了。

时区计算

1 function TimeZoneDiff()
2     local nowUtcSec = os.time()
3     local dt = os.date("!*t", nowUtcSec)
4     local timeZoneSec = os.difftime(nowUtcSec, os.time(dt))
5     local timeZoneHour = math.floor(timeZoneSec / 3600)
6     return timeZoneSec, timeZoneHour
7 end

tips: 东8区当前9点,那东7区(曼谷)就是8点,东9区(韩国)就是10点 

将服务器时间字符串解析成客户端时间戳:

比如:服务器在东8区(非夏令时),现在有一个活动是在1970-01-01 08:00:00开始;如果客户端在东7区,那这个时间转换到东7区就是1970-01-01 07:00:00(非夏令时);如果客户端此时还用了夏令时,那就是1970-01-01 08:00:00

 1 function ParseServer_yyyyMMdd_hhmmss(s_dtStr, s_timeZoneSec, s_isdst)
 2     local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)"
 3     local index1, index2, year, month, day, h, m, s = string.find(s_dtStr, pattern)
 4     
 5     ---转换为标准时区时间戳(比如: 服务器东8, 客户端东7, 此时准换结果是存在1个小时时区差的)
 6     local serverDt = { year = year, month = month, day = day, hour = h, min = m, sec = s }
 7     local clientTimeStamp = os.time(serverDt)
 8     local clientTimeZoneSec = TimeZoneDiff()
 9     local timeZoneFix = clientTimeZoneSec - s_timeZoneSec
10     ---
11     
12     local dstFix = 0
13     local c_isdst = os.date("*t", os.time()).isdst
14     if s_isdst then
15         if false == c_isdst then --服务器夏令时, 客户端不是
16             dstFix = -3600
17         end
18     else
19         if true == c_isdst then --客户端夏令时, 服务器不是
20             dstFix = 3600
21         end
22     end
23     
24     return clientTimeStamp + timeZoneFix + dstFix
25 end

夏令时参考:

https://www.zhihu.com/question/37097917

lua