ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Android ] D-Day 계산 오류
    Android 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("\\.")과 같이 작성해야한다.

     

     

    출처

    댓글

Designed by Tistory.