마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

월별 날짜 받는 방법에 대해서 질문있습니다.

0 추천

Calendar,

SimpleDateFornmat

클래스를 이용해서 월별 날짜를 불러오려고합니다

 

this.mCalander = Calendar.getInstance();
this.mDf = new SimpleDateFormat("yyyy-MM-dd");

for (int i = currentYear; i <=year ; i++) {
    mCalander.set(Calendar.YEAR, i);
    for (int j = 0; j <= 11; j++) {
        mCalander.set(Calendar.MONTH, j);
        Log.d("INFO", "MONTH : " + (j + 1));

        int maxDay = mCalander.getActualMaximum(Calendar.DAY_OF_MONTH);
        for (int k = 1; k <= maxDay; k++) {
           mCalander.set(Calendar.DAY_OF_MONTH, k);
           Log.d("INFO", mDf.format(this.mCalander.getTime()));
        }
    }
}

 

3중 for문으로 년, 월, 일을 돌려봤더니 Log출력은

 

2017-01-30
2017-01-31
MONTH : 2
2017-03-01
2017-03-02

 

이런식으로 2월인데 데이터는 3월로 나오는 현상이나오네요

왠지 calendar.set 함수가 asynchorize이여서 이런 결과값이 나오는거 같은 느낌인데..

이렇게 나오는 이유가 뭘까요 ?

그리고 월별 날짜를 출력하기 위해서 보다 정상적으로 나은방법이 있을까요 ?

peterlee 1 (310 포인트) 님이 2017년 2월 27일 질문

3개의 답변

0 추천
threetenabp를 쓰세요. https://github.com/JakeWharton/ThreeTenABP

java의 기본 Date, Calendar는 처음부터 설계가 잘못되었기 때문에 안 쓰는게 좋습니다.
익명사용자 님이 2017년 2월 27일 답변
0 추천

Calendar 인스턴스 함수중에

getActualMaximum

라는 애가 있어요.

 

		Calendar calendar = Calendar.getInstance();
		int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

이렇게 하시면 그 달의 최대 일수를 알수 있답니다.

 

 

Development Guy (70,570 포인트) 님이 2017년 2월 27일 답변
0 추천
...
mCalander.set(Calendar.MONTH, j);
mCalander.set(Calendar.DAY_OF_MONTH, 1);
...

 

저라면 이런 식으로 나눠서 만들었을 거예요.

private void click() {
  for (int year = 2017; year < 2018; year++) {
    for (int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {
      Log.w("INFO", "month =========================|" + (month + 1));
      int lastDay = lastDayOfMonth(year, month);

      for (int day = 1; day <= lastDay; day++) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day);
        Log.w("INFO", "|" + format(cal.getTimeInMillis()));
      }
    }
  }
}

private int lastDayOfMonth(int year, int month) {
  Calendar calendar = Calendar.getInstance();
  calendar.set(year, month, 1);
  return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}

private String format(long timeMillis) {
  return new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(timeMillis);
}

 

쎄미 (162,410 포인트) 님이 2017년 2월 28일 답변
쎄미님이 2017년 2월 28일 수정
...