본문 바로가기

DEVELOPMENT/JAVA

[JAVA] 연습문제 - 생일 D-Day 계산하기

문제

 

다음 내 생일까지 몇 일이 남았는지를 구하기

오늘: 2022-11-20
생일: 2023-09-10
D-294

 

 

풀이순서

 

1. Calendar 클래스의 인스턴스 2개 생성
2. 한 개는 생일날짜로 설정
3. 올 해 생일이 지났는지 확인
4. 생일이 지났으면 내년 생일로 변경
5. 디데이 출력

 

 

 

전체코드

 

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DDay {
    public static void main(String[] args) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();

        cal2.set(Calendar.MONTH, Calendar.SEPTEMBER);
        cal2.set(Calendar.DATE, 10);

        int today = cal1.get(Calendar.DAY_OF_YEAR);
        int birthday = cal2.get(Calendar.DAY_OF_YEAR);
        
        int dDay;
        if (today > birthday) {
            cal2.add(Calendar.YEAR, 1);
            dDay = cal1.getActualMaximum(Calendar.DAY_OF_YEAR) + birthday - today;
        } else if (today < birthday) {
            dDay = birthday - today;
        } else {
            dDay = 0;
        }
        
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println("오늘: " + df.format(cal1.getTime()));
        System.out.println("생일: " + df.format(cal2.getTime()));
        System.out.println("D-" + dDay);
    }
}

 

 

풀이과정

 

 

1. Calendar 클래스의 인스턴스 2개 생성

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

 

 

 

2. 한 개는 생일날짜로 설정

cal2.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal2.set(Calendar.DATE, 10);

 

+) 현재 날짜로 생성된 Calendar 인스턴스를 다른 날짜를 설정하고 싶을 경우

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2023); // 년도 바꾸기
cal.set(Calendar.MONTH, Calendar.JANUARY); // 월 바꾸기
cal.set(Calendar.DATE, 1); // 일 바꾸기
cal.set(2022, 11, 25); // 년, 월(0~11, 1월:0), 일 바꾸기

 

 

 

3. 올 해 생일이 지났는지 확인

int today = cal1.get(Calendar.DAY_OF_YEAR);
int birthday = cal2.get(Calendar.DAY_OF_YEAR);

오늘 날짜와 생일 날짜를 이 해의 몇 일인지 int 값으로 구하여 값 비교하기

 

get(int field)
현재 객체의 주어진 값의 필드에 해당하는 상수 값을 반환한다.

 

Calendar.DAY_OF_YEAR
이 해의 몇 일

 

 

 

4. 생일이 지났으면 내년 생일로 변경

int dDay;
if (today > birthday) {
    cal2.add(Calendar.YEAR, 1);
    dDay = cal1.getActualMaximum(Calendar.DAY_OF_YEAR) + birthday - today;
} else if (today < birthday) {
    dDay = birthday - today;
} else {
    dDay = 0;
}

오늘 날짜와 생일 날짜를 비교하여 오늘 날짜가 생일 날짜보다 더 큰 경우, 생일이 지났으므로 년도 값을 1 더해준다.

 

add(Calendar.YEAR, 1)

add는 지정한 필드의 값을 원하는 만큼 증가 또는 감소시킨다.

 년도 값을 1 만큼 증가 시켜준다.

 

getActualMaximum(int field)

현재 객체의 특정 필드의 최대 값을 반환한다.

 

cal1.getActualMaximum(Calendar.DAY_OF_YEAR)

cal1(오늘 날짜)이 포함된 년도(올해)의 일수를 구한다.

 

dDay = cal1.getActualMaximum(Calendar.DAY_OF_YEAR) + birthday - today

생일이 지난 경우, 내년 생일 날짜 - 현재 날짜를 구해야 한다.

디데이(남은 날짜)  = 올해 일수 + 생일까지 일수 - 현재까지 일수 

 

 


5. 디데이 출력

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("오늘: " + df.format(cal1.getTime()));
System.out.println("생일: " + df.format(cal2.getTime()));
System.out.println("D-" + dDay);

 

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd E");
SimpleDateFormat는 날짜 데이터를 원하는 형식으로 출력하기 위해서 사용한다.
출력하고자 하는 Date인스턴스를 가지고 format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻게 된다.