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