Lua遊戲時區問題

 

關於cocos2dx-lua版本中游戲時間顯示問題 

 分類:
 
時間顯示問題說白了就是時差問題(下面代碼片段是以lua腳本寫的)。
通常來講,遊戲中時間是以遊戲服務器時間爲準。遊戲登陸時,會從服務器接收一個時間,廣泛方案是接收一個時間戳,而後客戶端本身維護這個時間戳。有時,客戶端會進行這個時間的顯示:
local ServerTimeStamp = XXXXXXXX  --這個是服務端發給客戶端維護的時間戳
local ServerTimeZone = XXXX      --這個是服務端時間的時區差值(也是由服務端發給客戶端)
local CurrentDateTime = os.date("*t",ServerTimeStamp)
print("year="..CurrentDateTime.year)
print("month="..CurrentDateTime.month)
print("day="..CurrentDateTime.day)
print("hour="..CurrentDateTime.hour)
print("min="..CurrentDateTime.min)

print("sec="..CurrentDateTime.sec)框架

若是你的遊戲服務端時間的時區是東八區,且跑上面代碼的機子的時區也是東八區,你可能會很是樂意地看到,打印出來的時間與服務端時間是一致的;可是用來跑上面代碼的機子的時區不是東八區,如一個日本人使用他機子來跑你的程序(他的機子時區是東九區),這時會看到打印出來的時間比這遊戲服務端的時間快了1個小時,這確定是錯誤的。post

爲何會這樣? 原來上面調用os.date()時會把當前設備的時區也關聯上去。因此在東八區設備下跑徹底是正確的。但你不可能指定別人使用固定時區的機子來跑你的程序吧,那怎辦呢? -- Compute the difference in seconds between local time and UTC. local function get_timezone()   local now = os.time()   return os.difftime(now, os.time(os.date("!*t", now))) end local localTimeZone = get_timezone() local timeZoneD = ServerTimeZone - localTimeZone  --計算出服務端時區與客戶端時區差值 local CurrentDateTime = os.date("*t",ServerTimeStamp + timeZoneD) 這時你會發現,不管你使用東八區、東九區或者其它時區的機子去跑,它都正確地打印出這個服務器的時間。 擴展一下來講,只要你作了這個時區的差值處理,不管服務器的時區是哪一個,不管客戶端的時區是哪一個,客戶端都能正確地顯示服務器的時間。 再擴展一下來講,不管是哪一個cocos2dx的版本,不管是使用哪一個遊戲引擎框架,都應該在處理時間上作相似上面的時區處理,讓客戶端可以正確地顯示服務端的時間。
相關文章
相關標籤/搜索