안녕하세요 ~
앱을 개발하다 시간 계산하는 문제가 제기되여 이렇게 글을 올려봅니다.
문제는 아래와 같습니다.
로그인 한 시점으로 부터 7일 동안 자동로그인이 가능하고 그이후엔 다시 로그인 해야 하는 문제입니다.
현재 저는 로그인버튼 누를때 사건에서
Calendar gameDate = null;
gameDate = Calendar.getInstance(Locale.KOREAN); // 현재 시간을 얻어온다
gameDate.add(Calendar.DATE, 7); // 7일 앞선 날자를 계산한다
lAvailableDate = gameDate.getTimeInMillis(); // 보관하기 위해 미리초로 변환
다음 남은 일수를 현시하기 위해서 아래와 같이 했습니다.
Calendar gameDate = null;
gameDate = Calendar.getInstance(Locale.KOREAN); // 현재 시간을 얻어온다
lLeaveDay = lAvailableDate - gameDate.getTimeInMillis(); // 남은 시간을 알기 위해서 로그인 한 시간과 현재 시간 차
if ( lLeaveDay > 0 ) // 차이가 있다면
{
gameDate.setTimeInMillis(lLeaveDay ); // 일, 시간, 분, 초를 알기 위해서
일 = gameDate.get(Calendar.DATE);
시간 = gameDate.get(Calendar.HOUR_OF_DAY);
분 = gameDate.get(Calendar.MINUTE);
초 = gameDate.get(Calendar.SECOND);
}
그런데 오류는
분명 7일 부터 계수가 되여야 할것 같은데 즉
"6일 23시 59분 59초"
"6일 23시 59분 58초"
"6일 23시 59분 57초" ...
으로 되여야 할것 같은데
"8일 8시 59분 59초"
"8일 8시 59분 58초"
"8일 8시 59분 57초" ...
로 현시 됩니다.
자세히 보니 폰의 시간대역을 GMT+0 으로 설정하면 정상동작하는데 현재 서울 GMT+9 로 설정하니 꼭 9시간이 플러스된 현재 상황이 나왔습니다.
수정할수 있는 방법을 좀 가르쳐 주세요. 수정불가능 할까요?
많은 고수님들 도와주시면 감사하겠습니다.
오래 되었지만 혹시나 해서 답변 달아 봅니다.
gameDate.getTimeInMillis(); 미리초는 전세계가 같습니다. 그것에 각 시간을 환산한 값 우리나라 같은 경우 9시간을 환산한 값을 더하여 결과값을 보여주도록 구성되어 있는 것 같습니다.
테스트 결과 시스템 시간을 구할 때 단말기 세팅을 GMT, GMT+9 을 해도 나오는 gameDate.getTimeInMillis(); 값은 같았습니다.
그래서 다음과 같은 방법으로 해보시는게 어떨까 합니다
로그인 시 gameDate.getTimeInMillis();의 값에 7일을 더한 값을 가지고 현재의 시간과 비교 하는 방법입니다.
7일은 시간 단위로 하면 24시간 이므로 7*24=168 시간 이고 1시간은 60분 이므로 168*60=10080분 입니다.
그리고 초로 환산하면 10080*60=604800초 이므로 밀리초는 1초가 1000밀리초 이므로 초 값에 1000을 곱한 604800*1000=604800000밀리초가 됩니다
즉, 7일을 밀리초로 환산하면 604800000밀리초가 되므로
로그인시 나온 gameDate.getTimeInMillis(); 값에 604800000를 더한 값을 현재 접속 시간과 비교 하셔서 하는 방법으로 하시면 되지 않을 까 봅니다.
그리고 시간 대역이 바뀌면 바뀌는 현상은 맞다고 보여 집니다.
예를 들어 한국에서 5일 12시에 로그인 했다면 7일 후는 12일 12시가 맞지만 만약 한국에서 로그인 한 후 영국으로 갔다면 7일 후는 12일 12시가 아닌 12일 3시가 되겠지요.
즉, 상대적 시간으로 보면 7일 후가 아닌 것 처럼 보이나 절대적 시간으로 따지면 7일 후가 맞는 것이지요..




크게 두가지 오류가 있습니다.
하나는 1일이 더나오는것이고
하나는 9시간이 더해지는겁니다.
따라서 1일 9시간이 더 나오는거죠
여기서 1일을 줄이는 방법은 일자에서 1을 빼는겁니다.
밀리초로 0을 넣어도 1970년 1월 1일이 되기 때문에 1을 빼야 정확한 차이를 구할 수 있습니다.