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個小時,這肯定是錯誤的。

為什么會這樣?
原來上面調用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的版本,無論是使用哪個游戲引擎框架,都應該在處理時間上做類似上面的時區處理,讓客戶端能夠正確地顯示服務端的時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM