夏令时相关
夏令时是什么?
说简单点就是人为调快时间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