개발중, 요일 데이터("sun","mon", "tue", "wed", "thu", "fri", "sat") 월~일 중 하나를 받고,
현재 날짜를 기준으로 과거의 날짜를 제외한, 해당 요일의 날짜를 알아야 하는 상황이 있었다.
예를 들면 오늘 날짜 2016-04-06(수)요일에 월, 수 , 금요일을 입력 받으면
2016年 4月
일 |
월 |
화 |
수 |
목 |
금 |
토 |
03 |
04 |
05 |
06 |
07 |
08 |
09 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
위와 같이 2016-04-06, 2016-04-08, 2016-04-11 의 데이터를 얻어오는 것이 목적이었다.
소스는 다음과 같다.
final String DAY_DATE_FORMAT = "yyyy-MM-dd";SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DAY_DATE_FORMAT);public static String weekDayMaker(String week){
final String[] weekArr = {"sun","mon", "tue", "wed", "thu", "fri", "sat"};
int yoilNum = -1;
for(int i=0; i<weekArr.length; i++){
if(weekArr[i].equals(week)){
yoilNum = i+1;
}
}
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, yoilNum);
Date date = calendar.getTime();
String dateStr = simpleDateFormat.format(dateCompare(date, today()));
return dateStr;
}
/*
0 - 날짜가 같음
1 - 날짜a가 날짜b 보다 이후의 날짜
-1 - 날짜a가 날짜b 보다 이전의 날짜
*/
private static Date dateCompare(Date a, Date b){
String dateA = simpleDateFormat.format(a);
String dateB = simpleDateFormat.format(b);
Calendar c = Calendar.getInstance();
c.setTime(a);
if(dateA.compareTo(dateB) < 0){
c.add(c.DATE, +7);
return c.getTime();
}else{
return a;
}
}
// 현재 날짜 Date값 가져오기
public static Date today(){
return Calendar.getInstance().getTime();
}
날짜를 비교하는데 Date 클래스에서 제공하는 compareTo와, String 클래스에서 제공하는 compareTo 두 가지가
있어 무엇을 사용해 해결할지 고민하다가 String에 compareTo를 사용하기로 결정하였다.
처음에는 Date의 compareTo를 활용하였는데, 문제점이 있었다.
Date - compareTo
public int compareTo(Date date) {
if (milliseconds < date.milliseconds) {
return -1;
}
if (milliseconds == date.milliseconds) {
return 0;
}
return 1;
}
내 소스
private static Date dateCompare(Date a, Date b){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DAY_DATE_FORMAT);
Calendar c = Calendar.getInstance();
c.setTime(a);
if(a.compareTo(b) < 0){
c.add(c.DATE, +7);
return c.getTime();
}else{
return a;
}
}
이렇게 했을때 compareTo에서는 비교를 milliseconds 단위로 비교를 하기 때문에 Calendar 객체의 getTime()을 호출했을때,
너무 정확한 값을 가져와서 문제가 되었다. milliseconds단위라 끝자리가 간헐적으로 변경되어 같은 날짜임에도 불구하고,
다른 날짜로 비교되는 문제가 발생하였다. 따라서 굳이 시분초단위 까지 비교하진 않고 단순 날짜만 비교하기에는
String compareTo가 적합하다고 판단되었고 아래와 같이 수정하여 해결하였다.
private static Date dateCompare(Date a, Date b){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DAY_DATE_FORMAT);
String dateA = simpleDateFormat.format(a);
String dateB = simpleDateFormat.format(b);
Calendar c = Calendar.getInstance();
c.setTime(a);
if(dateA.compareTo(dateB) < 0){
c.add(c.DATE, +7);
return c.getTime();
}else{
return a;
}
}
String - compareTo
오늘의 코딩일기 끝
'개발 공부 기록하기 > - Kotlin & Java' 카테고리의 다른 글
스레드 동기화 synchronized에 관해서 (1) | 2016.07.05 |
---|---|
[Java] 문자열 나누기 특수문자에 대해 (0) | 2016.05.10 |
[Java-lib] Object Mapper에 대해서 (0) | 2016.03.08 |
Callable과 Thread (0) | 2016.02.04 |
Thread.sleep throw InterruptedException? (0) | 2016.01.07 |