Android

[ Android ] D-Day 계산 오류

cat_cat 2020. 5. 22. 21:15

 

  CatServant  

D-day를 계산하면서 날짜 오류가 발생하였다. 

 

첫 번째 만난 오류는 현재 날짜가 한달 전으로 나오는 오류였다.

알고보니 java 에서는  Calendar.get(Calendar.MONTH) 를 했을 때, 현재 달에서 1달 전으로 나오는 문제가 있어서 이를 고쳐주기 위해서 +1을 해주고 다시 set해서 고쳐주었다.

 

두 번째 만난 오류는 시간때문에 D-day가 하루씩 차이나는 오류였다.

이를 해결해 주기 위해서는 Calendar의 시간을 모두 clear 해주고 계산하면 시간 때문에 날짜가 차이나는 오류는 해결할 수 있었다.

 

 Code

        private String getDday(String targetDay) {
            int tYear, tMonth, tDay;
            int dYear, dMonth, dDay;

            // target day
            String[] targetSlicing = targetDay.split("-");
            dYear = Integer.parseInt(targetSlicing[0]);
            dMonth = Integer.parseInt(targetSlicing[1]);
            dDay = Integer.parseInt(targetSlicing[2]);

            Calendar targetdayCalendar = Calendar.getInstance();
            targetdayCalendar.clear(Calendar.HOUR);
            targetdayCalendar.clear(Calendar.MINUTE);
            targetdayCalendar.clear(Calendar.SECOND);
            targetdayCalendar.clear(Calendar.MILLISECOND);
            targetdayCalendar.set(dYear, dMonth, dDay);

            // today
            Calendar todayCalendar = Calendar.getInstance();
            todayCalendar.clear(Calendar.HOUR);
            todayCalendar.clear(Calendar.MINUTE);
            todayCalendar.clear(Calendar.SECOND);
            todayCalendar.clear(Calendar.MILLISECOND);

            tYear = todayCalendar.get(Calendar.YEAR);
            tMonth = todayCalendar.get(Calendar.MONTH);
            tDay = todayCalendar.get(Calendar.DAY_OF_MONTH);
            todayCalendar.set(tYear, tMonth+1, tDay);

            long dayDiff = todayCalendar.getTimeInMillis() - targetdayCalendar.getTimeInMillis();

            // long convert(long sourceDuration, TimeUnit sourceUnit)
            // : 지정된 단위로 나타내지는 지정된 기간을 해당 단위로 변환합니다.
            int resultNumber = (int)(Math.floor(TimeUnit.HOURS.convert(dayDiff, TimeUnit.MILLISECONDS)/24f));
            if (resultNumber > 0) {
                return String.format("D+%d", resultNumber);
            }

            return String.format("D-%d", resultNumber);
        }
Method 설명
double ceil(double n) 올림
double floor(double n) 내림
long round(double n) 반올림

 

 

 Split Error

            String[] targetSlicing = targetDay.split("-");

해당 코드에서 targetDay.split(".")으로 바꾸니까 오류가 생겼다.

java.lang.String.splitregular expressions를 기준으로 동작하는데 regular expression에서 "."은 아무 문자를 넣든 상관 없다는 의미로 작동한다. 그래서 .을 기준으로 나누고 싶다면 targetDay.split("\\.")과 같이 작성해야한다.

 

 

출처