게임 시간대 문제 소해
os.time()
.원형:os.time ([table])
.설명:table의 내용에 따라 시간값(숫자)을 되돌려줍니다. 파라미터가 없으면 현재 시간을table 내용으로 사용합니다. 그 중에서table에 포함될 수 있는 필드는:year,month,day,hour,min,sec,isdst입니다. 다른 필드는 무시됩니다
os.date()
원형:os.날짜 ([format [,time]]]) 설명:format으로 포맷된 날짜, 시간의 문자열이나 테이블을 되돌려줍니다.매개변수 형식:
서버 시간대
서버 시간대로 시간 계산을 하려면 인코딩 사고방식은 로컬과 서버의 시간대 차이를 계산하고 os를 호출하는 것이다.time()、os.date () 시 보상합니다.
--
local ServerTimeZone = 3600 * 8
--
function TimeUtils.GetLocalTimeZone()
local now = os.time()
local localTimeZone = os.difftime(now, os.time(os.date("!*t", now)))
return localTimeZone
end
서버 시간대: 국내 서버에 대해 서버 시간대는 동팔구로 직접 하드코딩할 수 있으며 국제화를 고려하면 서버에서 이 값을 하달하고 지역에 따라 서로 다른 서버 시간대 값을 설정할 수 있다.로컬 시간대: 루아에서 로컬 시간대의api를 직접 가져오지 않았지만os를 통해.날짜 ("!*t", os.time (), 그리니치의 시간 테이블을 얻을 수 있으며, 로컬 시간대로 테이블을 해석하여 시간 스탬프, 이 시간 스탬프와 os를 얻을 수 있습니다.time () 시간 스탬프 상감은 시간대 초수 차값입니다.
현재 게임 내 기능 입구가 게임 서버 오픈 다음날 0시에 열린다고 가정하면 시간대 문제를 고려하지 않으면 인코딩은 다음과 같다. 유저가 로컬 시간대를 수정할 때 계산된 시간 스탬프는 다르다.이렇게 하면 유저는 로컬 시간대를 수정하여 기능을 앞당겨 열 수 있다.
-- 0
local nextDayTable = os.date("*t", openServerTime + 86400)
local nextDayZeroHourTime = os.time({year=nextDayTable.year, month=nextDayTable.month, day=nextDayTable.day, hour=0,min=0,sec=0})
그래서 os에 대해.date()、os.time () 은 서버 시간대를 기준으로 불러오기/되돌아오는 시간 테이블을 봉인합니다.이 시간대는 시간 계산 논리에 전혀 영향을 주지 않을 것이다.
-- os.date , ,
-- @param format: os.date
-- @param timestamp:
function TimeUtils.Date(format, timestamp)
local timeZoneDiff = ServerTimeZone - TimeUtils.GetLocalTimeZone()
return os.date(format, timestamp + timeZoneDiff)
end
-- os.time , ,
-- @param timedata: timedate
function TimeUtils.Time( timedate )
local timeZoneDiff = ServerTimeZone - TimeUtils.GetLocalTimeZone()
return os.time(timedate) - timeZoneDiff
end
-- 0
local nextDayTable = TimeUtils.Date("*t", openServerTime + 86400)
local nextDayZeroHourTime = TimeUtils.Time({year=nextDayTable.year, month=nextDayTable.month, day=nextDayTable.day, hour=0,min=0,sec=0})
TimeUtils를 통해.Date()、TimeUtils.os를 Time () 로 대체합니다.date()、os.time(), 업무 논리 처리 시간을 계산할 때 서버 시간대만 고려하면 되고, 향후 게임이 국제화되더라도 지역에 따라 Server TimeZone를 수정하면 업무층에 영향을 주지 않는다.
여름철
만약 우리가 간단하고 아름다운 세계에서 생활한다면 시구 문제는 이것으로 해결되고 부지런하고 지혜로운 국민들이 에너지 절약(sheng)을 위해 감축(qian)을 하기 위해 또 여름철을 발명했다. 상기 코드는 여름철을 실행하는 국가 지역에서 계산 결과가 틀렸을 것이다.
여름철에는 일광 절약 시간제라고도 하는데 영어로는 Daylight Saving Time, 줄여서 DST라고 부른다.백화로 말하자면 옛날에 어떤 사람들은 큰 녀석이 늦게 자고 늦게 일어나서 밤에 조명을 너무 오래 써서 돈을 낭비한다고 생각했는데, 여름에 날이 일찍 밝으면 큰 녀석이 여름에 시계를 1시간 빨리 맞추자고 제창했다. 너는 밤 12시에 자는 것이 습관이 되지 않았니?그것은 모두 시계를 1시간 빨리 조정하여 변형적으로 1시간 일찍 자게 함으로써 배출 감축을 절약할 수 있다.여름철 제도는 국가 단위로 집행되는 것으로 국가마다 1년에 여름철이 발효되는 시기가 다르다. 현재 전 세계 110개국이 매년 여름철을 실시하고 있다.영국 런던을 예로 들면 영국 런던은 영시구에 위치하고 중국 동팔구와 8시간 차이가 난다. 여름철을 실행하지 않는 날에 중국과 8시간 차이가 난다.여름철을 실시한 후 중국과 7시간밖에 차이가 나지 않는다.
여름철의 개념을 많이 잡아당겨 시간대로 돌아가 문제를 처리한다. 시간대차를 계산할 때 유저의 로컬 설정 시간대가 여름철을 실행하고 있는지 판단해야 한다. 만약에 원래의 계산 결과에 3600초를 더해야 한다.os.날짜 () 가 되돌아오는 시간table에는 isdst 필드가 있습니다. isdst=true는 여름철을 사용하고 있음을 나타냅니다.따라서 앞의 코드 최적화는 다음과 같다.
--
function TimeUtils.GetLocalTimeZone()
local now = os.time()
local localTimeZone = os.difftime(now, os.time(os.date("!*t", now)))
local isdst = os.date("*t", now).isdst
if isdst then localTimeZone = localTimeZone + 3600 end
return localTimeZone
end
국내 온라인 게임에 대해 이상의 시간대 처리를 하면 기본적으로 문제가 없다.진정으로 서로 다른 서버 국제화를 할 때 서버와 현지 시간대의 여름철 요인은 모두 고려하여 처리하고 나중에 기회가 있으면 구덩이를 밟고 기록해야 한다.
마지막 한마디는 국가가 시구를 통일한 것에 감사하고 국가가 여름철을 폐지한 것 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.