时间的计算和总结

时间

Posted by Jow on November 7, 2019

目录

  1. 前言
  2. 时间戳
  3. 时区
  4. 游戏中的计算

当你觉得真的很难的时候,就是需要迎头而上的时候,慢慢的你就会发现,自己真的成长进步了许多。

前言

在游戏中,时间的显示总是被应用在各个方面,活动开启的时间,活动关闭的时间,拿到这些时间怎么转换就显的尤为重要,一般如果游戏只是在国内上线可能不会遇到这个问题,因为大家进行转化你的时候区的都是东八区,所以服务器和客户端可以分别进行转换,但是如果服务器和客户端取不同的时区的话,可能就会存在转换的误差。

时间戳

时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。

ex:1520517337 这个时间戳在中国指东八区(GMT+8)的 2018/3/8 21:55:37,同时也指 (GMT)时间 2018/3/8 13:55:37

时区

时间戳 在地球的每一个角落都是相同的,但是在相同的时间点会有不同的表达方式,所以有了另外一个时间概念,叫时区。这里的时区与地区不是同一个概念,例如我们所在的时区叫 东八区 。

如何计算区时?

计算的区时=已知区时-(已知区时的时区-要计算区时的时区)。(注:东时区为正,西时区为负)

  • 已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时。

北京时间=12:00-(9-8)=11:00,即北京时间为5月1日11:00。

  • 已知北京时间为5月1日12:00,求伦敦(中时区)的区时。

伦敦时间=12:00-(8-0)=4:00,即伦敦时间为5月1日4:00。

  • 已知北京时间为5月1日12:00,求纽约(西五区)的区时。

纽约时间=12:00-[8-(-5)]=-1:00+24:00-1天=23:00,即纽约时间为4月30日的23:00。(注:当算出的区时为负数时,应加上24:00,日期减一天,即从5月1日变为4月30日)

  • 已知纽约时间为5月1日12:00,求东京的区时。

东京时间=12:00-[(-5)-9]=26:00-24:00+1天=2:00),即东京时间为5月2日2:00)。(注:当算出的区时大于或等于24:00时,应减去24:00,日期加一天,即从5月1日变为5月2日)。

判断新旧两天,要看两条线,一是人为日界线——180度国际日期变更线,二是自然分界线——当地时间为0点的地区经线。自西向东越过国际日期变更线,日期应减1天,比如你在国际日期变更线西侧,当地时间是20日的00:30,当你自西向东越过国际日期变更线后,你所在位置的当地时间是19日的00:30。如果是自东向西越过国际日期变更线,则应该加1天。

游戏中的计算

当我们从表里面取时间的时候一般如下:2019-10-18 17:43:04。这样的一个字符串,我们可以通过分隔符空格分隔,在分别利用’-‘和’:’这两个符号进行具体分隔,最后转换成整数就行了。

1
2
3
4
5
6
7
local time = "2019-10-18 17:43:04"
local time1 = time:split(' ')
local time2 = time1[1]:split('-')
local time3 = time1[2]:split(':')
local timeStamp = os.time({year=tonum(time2[1]), month=tonum(time2[2]), day=tonum(time2[3]), hour=tonum(time3[1]),min=tonum(time3[2]),sec=tonum(time3[3])})  --这里是存在问题的,这个时间戳的计算是根据当前时区计算的
--如果当前时区刚好是东八区,那没有问题,如果是中时区不就多了8个小时了,所以这个做是不行的
local timeStringShow = os.date("%Y年%m月%d日 %H时%M分%S秒",timeStamp)

所以说我们计算的时候还要考虑客户端当前处于的时区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
--从字符串时间 解析成时间 
--@timeString 2012-12-15 22:12:50
function DateUtil:stringToTime( timeString )  
    local timeArr = string.split(timeString," ")
    local leftPartArr = string.split(timeArr[1],"-")
    local rightPartArr = string.split(timeArr[2],":")
    local Y = leftPartArr[1] or 0
    local M = leftPartArr[2] or 0
    local D = leftPartArr[3] or 0
    local H = rightPartArr[1] or 0
    local m = rightPartArr[2] or 0
    local S = rightPartArr[3] or 0
    return os.time({year=Y, month=M, day=D, hour=H,min=m,sec=S})
end

local time = "2019-10-18 17:43:04"
-- 客户端时区   
local clientTimeZone = os.timezone() or (8 * 3600)   
local localStamp = DateUtil:stringToTime( time )  --相对于当前时区的时间戳