婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Lua游戲開發教程之時區問題詳解

Lua游戲開發教程之時區問題詳解

熱門標簽:昆明電話外呼系統好么 外呼系統一天耗費多少流量 杞縣地圖標注app 艾比利外呼系統 海口智能語音電銷機器人好用嗎 衡水外呼線路解決 電話機器人每天搜索多少次 免費門店地圖標注注冊入駐 陜西便宜電銷機器人軟件

前言

什么是Lua?

Lua 是一個小巧的腳本語言,巴西里約熱內盧天主教大學里的一個研究小組于1993年開發,其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。Lua由標準C編寫而成,幾乎在所有操作系統和平臺上都可以編譯,運行。一個完整的Lua解釋器不過200k,在目前所有腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是作為嵌入式腳本的最佳選擇。相比Python和Per的內核,Lua的內核小于120KB,而Python的內核大約860KB,Perl的內核大約1.1MB。Lua語言支持面向對象編程和函數式編程,它提供了一個通用類型的表table,可以實現數組、哈希表、集合、對象的功能。Lua支持協同進程機制。作為一門可擴展的語言,Lua提供簡單而穩定的交互接口,如Lua和C程序可通過一個堆棧交換數據,這使得Lua語言可以快速地和其它語言實現整合。

總體來說,Lua語言具備以下優點:

(1)語言優美、輕巧

(2)性能優良、速度快

(3)可擴展性強。

正因為Lua語言具備了這樣的特點,使得它能和游戲開發領域的需求完美地結合起來,因為我們需要這樣的一門語言,它能夠和C/C++進行完美地交互,因為我們需要它對底層進行封裝。它需要足夠地簡單,因為我們需要簡單、靈活、快速地編寫代碼。那么顯然Lua就是我們一直在尋找地這種語言。

目前大部分游戲都采用了Lua語言進行功能開發,在進行多語種發行的時候就會遇到時區顯示的問題。以韓國版本為例,場景如下:

1、服務器處于固定的位置,比如放在首爾機房;

2、玩家所處的位置不確定,可能在韓國,或者是出差在其它國家或地區;

需求:

無論在哪個國家或地區,統一顯示服務器的當前時間。在PC上查看,即便在國內測試的時候也顯示韓國首爾的時間(比北京時間快1個小時)。

實現:

-- 北京時間
local serverTime = 1536722753 -- 2018/09/12 11:25

function getTimeZone()
 local now = os.time()
 return os.difftime(now, os.time(os.date("!*t", now)))
end

-- 8 hour * 3600 seconds = 28800 seconds
local timeZone = getTimeZone()/ 3600

print("timeZone : " .. timeZone)



local timeInterval = os.time(os.date("!*t", serverTime)) + timeZone * 3600 + (os.date("*t", time).isdst and -1 or 0) * 3600

local timeTable = os.date("*t", timeInterval)

--[[
for k, v in pairs(timeTable) do
 print(k .. ":" .. tostring(v))
end
]]

print(timeTable.year .. "/" .. timeTable.month .. "/" .. timeTable.day .. " " .. timeTable.hour .. ":" .. timeTable.min .. ":" .. timeTable.sec)

關注是這個方法: os.date("!*t", now),其中以!為關鍵。

lua 源碼, loslib.c Line 283 行

static int os_date (lua_State *L) {
 size_t slen;
 const char *s = luaL_optlstring(L, 1, "%c", slen);
 time_t t = luaL_opt(L, l_checktime, 2, time(NULL));
 const char *se = s + slen; /* 's' end */
 struct tm tmr, *stm;
 if (*s == '!') { /* UTC? */
 stm = l_gmtime(t, tmr);
 s++; /* skip '!' */
 }
 else
 stm = l_localtime(t, tmr);
 if (stm == NULL) /* invalid date? */
 luaL_error(L, "time result cannot be represented in this installation");
 if (strcmp(s, "*t") == 0) {
 lua_createtable(L, 0, 9); /* 9 = number of fields */
 setallfields(L, stm);
 }
 else {
 char cc[4]; /* buffer for individual conversion specifiers */
 luaL_Buffer b;
 cc[0] = '%';
 luaL_buffinit(L, b);
 while (s  se) {
  if (*s != '%') /* not a conversion specifier? */
  luaL_addchar(b, *s++);
  else {
  size_t reslen;
  char *buff = luaL_prepbuffsize(b, SIZETIMEFMT);
  s++; /* skip '%' */
  s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */
  reslen = strftime(buff, SIZETIMEFMT, cc, stm);
  luaL_addsize(b, reslen);
  }
 }
 luaL_pushresult(b);
 }
 return 1;
}

從源碼可以看到 ! 調用了

#define l_gmtime(t,r)  gmtime_r(t,r)

gmtime_r 函數是標準的POSIX函數,它是線程安全的,將日歷時間轉換為用UTC時間表示的時間。

注:UTC —— 協調世界時,又稱世界統一時間、世界標準時間

也就是說 “!*t” 得到的是一個 UTC 時間,為0度的經線(子午線),亦稱本初子午線,通常將它與GMT視作等同(但是UTC更為科學和精確)。

 

首爾位于東9區,所以實際的時間應該是 UTC + 9,9就是時區差 —— 9個小時。北京位于東8區,即 UTC + 8。

如何保證游戲內全部統一為服務器的時間呢?

服務器需要返回給客戶端當前的時區的差值,比如韓國就返回 9,國內就返回 8,越南返回 7,北美返回 –16,記為 serverTimeZone。

服務端返回當前服務器時間serverTime(即首爾當前時間),我們只需要將服務器時間轉為 UTC 的時間,然后再加上 serverTimeZone即可。

os.time(os.date("!*t", serverTime)) + serverTimeZone * 3600

這樣無論在哪個地區或國家,都將顯示首爾的時候,與服務器顯示的時間就同步上了。

為什么要一直顯示服務器的時間呢?

游戲中有很多功能是有時間限制的,比如運營活動,或者功能開啟。如果用本地時間就不好控制,統一用服務器時間避免了很多問題。

可是也容易遇到一個坑,運營配置的活動時間都是針對當前服務器的時間,例如某個活動的截止時間是:2018-10-08 00:00:00,游戲需要顯示活動截止倒計時。

通常的做法: ployEndTime – serverTime,得到一個秒數,然后將秒轉成:xx天xx小時xx分xx秒

serverTime 是固定的,可是ployEndTime就容易出錯,為什么?

serverTime 是在東9區 —— 首爾的時間,而 os.time({year=…}) 是根據本地時間來算時間的,這中間就存在問題。有一個時差的問題,之前計算一直用的是serverTimeZone —— 一個固定值,而我當前處于地區或國家,它相對于UTC的時區不確定的,怎么辦?

用 (currTimeZone – serverTimeZone) * 3600 / 秒,os.time()之后再加上這個時區差就是首爾當前的時間戳了。國內東8 - 東9  = -1,也就是要減去一個1時區,最終將得到首爾地區的時間戳,再減去 serverTime 就是剩下的秒數了,然后將它轉為 xx 天 xx 小時 xx 分 xx 秒。

最后小結一下:

1)os.time({year=xx}),這個時間算出來的是針對當前所處時區的那個時間戳。

2)os.date(“!*t”, 時間戳) 得到的是UTC(時區為0)的時間戳。

3)獲取當前時區的值,可以通過文章開頭的 getTimeZone 方法

4)想顯示固定時區的時間(例如無論在哪都顯示服務器的時間),只需要將(服務器)時間戳(秒),通過第2步的方法,得到 UTC 再加上固定的時區差

5)計算倒計時的時候,需要考慮到 os.time 是取當前時區,需要再將當前時區減去目標時區,再計劃時間戳

6)夏令時,本身已經撥快了一個小時,當需要顯示為固定時區的時間,則需要減去一個小時

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Lua在各個操作系統中的開發環境配置教程
  • lua開發中實現MVC框架的簡單應用
  • 安裝Nginx+Lua開發環境
  • Centos7 安裝Nginx整合Lua的示例代碼
  • Nginx安裝lua-nginx-module模塊的方法步驟
  • cocos2dx+lua實現橡皮擦功能
  • Lua中三種循環語句的使用講解
  • Lua中的變量與賦值方法
  • Lua協同程序coroutine的簡介及優缺點
  • Luvit像Node.js一樣寫Lua應用

標簽:營口 海口 南京 西寧 宿遷 泰安 昌都 臨滄

巨人網絡通訊聲明:本文標題《Lua游戲開發教程之時區問題詳解》,本文關鍵詞  Lua,游戲,開發,教程,之,時區,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua游戲開發教程之時區問題詳解》相關的同類信息!
  • 本頁收集關于Lua游戲開發教程之時區問題詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产清纯美女被跳蛋高潮一区二区久久w| 欧美高清性hdvideosex| 欧美tickling网站挠脚心| 美女视频黄 久久| 欧美白人最猛性xxxxx69交| 国产成人亚洲精品狼色在线| 亚洲视频你懂的| 欧美一级搡bbbb搡bbbb| 国产成人三级在线观看| 一区二区三区日本| 日韩欧美在线一区二区三区| 粉嫩aⅴ一区二区三区四区| 亚洲国产成人av| 欧美精品一区男女天堂| 99国产精品一区| 卡一卡二国产精品| 亚洲视频在线观看一区| 538在线一区二区精品国产| 国产精品夜夜嗨| 午夜精品久久一牛影视| 中文久久乱码一区二区| 91精品国产色综合久久ai换脸 | 一区二区三区日本| 欧美精品一区二区三区在线 | 欧美精品第1页| 国产成人精品影院| 亚洲va天堂va国产va久| 欧美国产日韩亚洲一区| 欧美理论电影在线| 91蜜桃在线观看| 国产一区在线精品| 日本不卡在线视频| 一区二区在线观看免费 | 国产91对白在线观看九色| 综合分类小说区另类春色亚洲小说欧美| 欧美久久婷婷综合色| 国产经典欧美精品| 久久激情综合网| 婷婷国产v国产偷v亚洲高清| 亚洲欧美区自拍先锋| 日韩欧美视频一区| 99re热视频这里只精品| 国产一区二区精品在线观看| 亚洲成人综合网站| 国产精品免费视频一区| 精品国产sm最大网站免费看| 欧美伦理电影网| 色欧美片视频在线观看在线视频| 国内外精品视频| 天堂成人国产精品一区| 亚洲美女偷拍久久| 国产精品色在线观看| 精品精品国产高清a毛片牛牛 | 欧美aaaaa成人免费观看视频| 国产精品国产自产拍高清av王其| 欧美精品 日韩| 欧美日韩美少妇| 91小视频在线| 91色|porny| 色综合天天综合狠狠| 99re这里都是精品| 黄页视频在线91| 日韩精品欧美精品| 日韩av一区二区三区| 午夜成人在线视频| 亚洲一区二区视频在线观看| 一区二区在线观看免费| 亚洲日本在线看| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美主播一区二区三区美女| 成人综合激情网| 成人动漫精品一区二区| 国产精品一二三区在线| 国产在线播精品第三| 国产精品99久久久久久久vr| 国产在线精品一区二区不卡了 | 毛片av中文字幕一区二区| 婷婷六月综合亚洲| 亚洲一二三四区| 午夜视频在线观看一区| 亚洲香肠在线观看| 亚洲国产视频一区二区| 视频在线观看国产精品| 青青国产91久久久久久| 韩国午夜理伦三级不卡影院| 国产激情精品久久久第一区二区| 国产成人免费视频精品含羞草妖精| 粉嫩绯色av一区二区在线观看| 成人综合婷婷国产精品久久蜜臀| 色综合久久久久网| 欧美亚洲另类激情小说| 欧美一区二区视频免费观看| 2020国产精品自拍| 中文字幕欧美三区| 一区二区三区欧美在线观看| 一区二区三区国产| 免费不卡在线视频| 波多野结衣视频一区| 97se狠狠狠综合亚洲狠狠| 欧美日韩另类国产亚洲欧美一级| 91精品欧美久久久久久动漫 | 欧美变态tickling挠脚心| 欧美激情一区三区| 亚洲精品免费电影| 奇米精品一区二区三区在线观看一| 久久99精品国产麻豆婷婷| 成人精品视频一区| 在线免费观看不卡av| 欧美一级黄色大片| 国产精品日韩精品欧美在线| 亚洲制服丝袜在线| 麻豆精品在线看| 99久久久久久| 日韩午夜在线影院| 国产精品成人在线观看| 亚洲第一激情av| 丁香天五香天堂综合| 欧美日韩成人高清| 国产视频一区不卡| 亚洲成人免费观看| 国产aⅴ精品一区二区三区色成熟| 在线视频欧美区| 日本一区二区三级电影在线观看| 亚洲人精品午夜| 国产一区二区三区在线观看免费视频| 欧美一卡二卡三卡| 99久久国产综合色|国产精品| 欧美日韩精品欧美日韩精品一| 久久综合九色综合欧美98| 亚洲永久精品大片| 国产一区二区剧情av在线| 欧美无砖砖区免费| 国产精品嫩草影院com| 蜜桃精品视频在线| 欧美日韩免费电影| 中文字幕第一区综合| 久久福利资源站| 欧美日韩精品一区二区三区蜜桃| 国产欧美日韩综合精品一区二区| 青青青爽久久午夜综合久久午夜| 91免费观看视频| 国产欧美一区二区三区鸳鸯浴| 秋霞成人午夜伦在线观看| 色综合久久中文综合久久97 | 日韩一卡二卡三卡四卡| 亚洲色欲色欲www| 国产99精品视频| 日韩视频永久免费| 亚洲成av人片| 在线中文字幕不卡| 中文字幕国产一区二区| 国产精品一线二线三线| 国产福利一区在线观看| 337p粉嫩大胆色噜噜噜噜亚洲 | 亚洲国产精品久久一线不卡| 国产69精品久久777的优势| 精品少妇一区二区三区日产乱码| 日韩不卡一区二区| 色天天综合色天天久久| 17c精品麻豆一区二区免费| 国产成人午夜视频| 亚洲精品在线三区| 激情五月激情综合网| 欧美精品三级日韩久久| 亚洲国产美女搞黄色| 在线亚洲一区二区| 国产精品不卡在线| caoporen国产精品视频| 久久无码av三级| 蜜桃一区二区三区在线| 欧美一区二区三区公司| 天堂蜜桃91精品| 欧美日韩免费在线视频| 亚洲成av人片在线观看无码| 色综合久久久久| 亚洲国产一区视频| 欧美一级午夜免费电影| 亚洲gay无套男同| 欧美丰满美乳xxx高潮www| 亚洲国产精品嫩草影院| 欧洲激情一区二区| 日本中文一区二区三区| 51精品秘密在线观看| 国产高清亚洲一区| 久久精品久久精品| 日韩午夜精品电影| 国产成人综合在线| 亚洲国产高清aⅴ视频| 成人h精品动漫一区二区三区| 亚洲精品视频免费看| 欧美日韩成人综合天天影院| 日本亚洲免费观看| 久久先锋影音av鲁色资源| 不卡的av在线| 亚洲图片欧美一区| 337p粉嫩大胆噜噜噜噜噜91av| 国产成人精品亚洲午夜麻豆| 亚洲免费高清视频在线| 91精品国产综合久久精品| 久久成人久久鬼色|