게임 시간대 문제 소해

5054 단어
시간대, 여름철의 존재로 인해 게임 내의 시간 표시/계산은 시간대 문제를 고려하여 상응하는 처리를 해야 한다.시간 계산은 말할 것도 없고 유저의 로컬 시간대 영향을 배제하고 서버 시간대만 기준으로 계산합니다.시간 표시에는 두 가지 시나리오가 있습니다.
  • 서버에서 보낸 utc 타임 스탬프에 따라 유저의 핸드폰 로컬에 설정된 시간대에 따라 적당한 디스플레이를 한다. 이렇게 하면 서로 다른 시간대를 자주 왕복하는 유저에게 매우 우호적이다(이런 유저는 매우 적지만). 유저가 핸드폰 시간대를 수정하면 게임 내의 시간 디스플레이는 이 시간대를 기준으로 한다.그러나 이런 방안은 보통 문제에 부딪힌다. 예를 들어 게임 내 활동 사진에 날짜가 적혀 있고 시간은 게이머의 휴대전화 시간대에 따라 적당히 표시할 수 없다
  • 서버 시간대에 따라 통일된 디스플레이를 하는 것이 더 좋은 방안이다. 국내 온라인 게임이라면 동팔구의 시간을 통일적으로 표시할 수 있다. 그러면 사진 속의 시간 정보가 정확하다는 것을 보장할 수 있다.이런 방안도 장점이 있다. 게이머들이 모르는 사이에 시간대를 다른 시간대로 설정하고 시간을 동팔구 시간으로 설정할 때(우리 프로젝트에 기획된 핸드폰이 있는데 바로 이렇게 설정한 -_-||) 게임 내의 시간은'보기에'가 정확하다.간단하게 요약하면 게임 내의 시간 표시/계산은 서버 시간대를 기준으로 하는 것이 가장 좋고 각종 언어에서 시간 함수에 관한api는 모두 로컬 시간대 계산으로 결과를 되돌려준다. Lua를 예로 들면 Lua 표준 라이브러리에서 제공하는 시간 함수 os.time () 및 os.date (), 이 두 함수가 들어오고 돌아오는 시간table는 로컬 시간대를 기준으로 합니다

  • os.time()


    .원형:os.time ([table])
    .설명:table의 내용에 따라 시간값(숫자)을 되돌려줍니다. 파라미터가 없으면 현재 시간을table 내용으로 사용합니다. 그 중에서table에 포함될 수 있는 필드는:year,month,day,hour,min,sec,isdst입니다. 다른 필드는 무시됩니다

    os.date()


    원형:os.날짜 ([format [,time]]]) 설명:format으로 포맷된 날짜, 시간의 문자열이나 테이블을 되돌려줍니다.매개변수 형식:
  • 원형에서 알 수 있듯이 두 번째 파라미터를 생략할 수도 있고 두 번째 파라미터 함수만 생략하면 현재 시간을 두 번째 파라미터로 사용하고 두 번째 파라미터가 생략되면 현재 시스템의 설정에 따라 포맷된 문자열을 되돌려 다음 등가로 os를 대체합니다.date() <=> os.date("%c").
  • format이 "!"이면처음에는 그리니치 시간에 따라 포맷을 진행합니다.
  • 만약format이'*t'라면 year(4위),month(1-12),day(1-31),hour(0-23),min(0-59),sec(0-61),wday(요일, 일요일은 1),yday(연내 일수),isdst(일광 절약 시간 여부true/false)의 키 이름이 있는 표를 되돌려줍니다
  • 만약format이'*t'가 아니라면os.날짜는 문자열로 포맷됩니다

  • 서버 시간대


    서버 시간대로 시간 계산을 하려면 인코딩 사고방식은 로컬과 서버의 시간대 차이를 계산하고 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

    국내 온라인 게임에 대해 이상의 시간대 처리를 하면 기본적으로 문제가 없다.진정으로 서로 다른 서버 국제화를 할 때 서버와 현지 시간대의 여름철 요인은 모두 고려하여 처리하고 나중에 기회가 있으면 구덩이를 밟고 기록해야 한다.
    마지막 한마디는 국가가 시구를 통일한 것에 감사하고 국가가 여름철을 폐지한 것 같다.

    좋은 웹페이지 즐겨찾기