안드로이드 calendar 하루 오차

조회수 2641회

                TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker);
                int hour = timePicker.getHour();
                int minute = timePicker.getMinute();

                Calendar calendar = Calendar.getInstance();

                calendar.add(Calendar.DATE, 1);
                calendar.set(Calendar.HOUR_OF_DAY, hour-9);
                calendar.set(Calendar.MINUTE, minute);
                calendar.set(Calendar.SECOND, 0);

                Date date = calendar.getTime();

                Intent intent = new Intent(SubActivity.this, AlarmDialogActivity.class);
                intent.putExtra("리잉톤", ringtoneUri); //링톤Uri 값을 인텐트에 태워 보낸댜
                PendingIntent pIntent = PendingIntent.getActivity(SubActivity.this, 0, intent, 0);

                Log.i("로그찍어 설정한 시간", ""+date);

                //알람매니저 생성
                AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);

calendar를 생성한 후에 timepicker에서 값을 가져와서 수정해서 그 시간에 알람이 울리게 하고 있습니다..

calendar를 기본 세팅하게되면 그 값은 현재 시간을 나타내게 되는데요..

근데 여기서 문제는 제가 시와 분을 셋팅하고 로그를 찍어보면 그 시간이 다른건 다 정확한데 DATE값, 즉 일수가 하루차이로 들쭉날쭉합니다..

실제 현재 시간이 8월 30일일때, 어떨땐 8월30일로 잘 찍히다가, 하루가 지나면 하루전 값으로 찍히고, 다시 하루가 지나면 정상적인 DATE값으로 잘찍힙니다.

하루걸러서 이렇게 정확했다가, 하루 전 값으로 DATE가 셋팅이 되는 바람에 calendar.add(Calendar.DATE, 1); 이 코드를 썻다가 지웠다 반복중입니다..

어제까지는 8월 29일 정확히 찍히다가, 오늘 8월 30일이되니까 하루 전값인 8월29일로 되는 바람에 다시 calendar.add(Calendar.DATE, 1);를 추가했네요

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 다음 두가지를 확인해보는게 좋을 것 같습니다.

    1) 디바이스의 타임존이 어떻게 설정되어 있는지 확인하세요. "설정 > 날짜 및 시간 > 표준 시간대 선택"에서(메뉴명은 넥서스 디바이스 기준) GMT+09:00 한국 표준시로 설정되어 있는지 확인이 필요합니다. GMT+09:00가 아닐 경우, 현재 시간(=서울 시간)과 다르게 나올 수 있습니다.

    2) 올려주신 코드 calendar.set(Calendar.HOUR_OF_DAY, hour-9); 라인을 보면 현재 시간에서 -9를 하는데 이렇게 하는 이유는 무엇인가요? 현재 코드라면 타임 피커에서 사용자가 설정한 시간보다 9시간 이전의 시간으로 설정 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 매번 정성스러운 답변 감사합니다. calendar.set(Calendar.HOUR_OF_DAY, hour-9); 여기서 -9를 한 이유는, -9를 하지 않을경우 Wed Aug 31 04:04:33 GMT+09:00 2016 이렇게 이상하게도 9시간이 플러스가 되서 시간이 찍히기에 일부러 -9를 해준겁니다.(저 시간 값은 로그에 찍어서 정확히 확인해본 값입니다..) 또한 디바이스의 타임존은 정상적으로 한국 표준시로 되어있으므로 디바이스 문제는 아닌 것같습니다... 제가 이 질문을 올릴 당시 오늘 점심까지만 해도 하루 전값으로 계산이 되길래 calendar.add(Calendar.DATE, 1); 값을 추가하여 30일인 오늘로 시간을 맞췄었는데, 지금 또 로그를 찍어보니 이번엔 다시 정상적으로 30일로 계산이되어 calendar.add(Calendar.DATE, 1); 이 값을 지워줬습니다.. 계속 들쭉날쭉하며 전날 값으로 계산이 되었다가 정상적으로 계산이 되었다합니다. 어찌된 영문인지 답답하네요 알 수 없는 사용자 2016.8.30 19:08
    • 결론은 -9를 하면 안됩니다. GMT+09:00이라고 출력되는 것은 한국 표준시가 GMT를 기준으로 9시간이 빠르다는 것(=타임존)을 의미할 뿐입니다. 따라서 결과가 들쭉날쭉한 것은 타임피커로 설정한 시간에서 -9를 했기 때문입니다. GMT(또는 UTC), 타임존에 대한 내용으로 검색을 해보면 용어에 대한 해석을 어렵지 않게 찾아 볼 수 있습니다. 알 수 없는 사용자 2016.8.31 00:39
    • timeZone으로 따로 지역까지 설정해야되는군요 이제야 알아갑니다 감사합니다! 알 수 없는 사용자 2016.8.31 02:49

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)