상세 컨텐츠

본문 제목

[JAVA] Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

Spring/JAVA

by Chan.94 2023. 2. 19. 17:56

본문

반응형

자바 8 이상의 버전을 사용하고 있다면 java.time 패키지를 사용하는 것이 바람직하다.

자바 8 이하를 사용하고 있다면 Calendar를 사용하고 8이상이라면 LocalDate, LocalTime, LocalDateTime을 사용하도록 하자.

 

LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

 

[JAVA] LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

Calendar를 사용하여 날짜와 시간을 구하는 것에 대해 정리한 적이 있다. Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기 [JAVA] Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초,

fvor001.tistory.com

 

java.time 패키지

  • LocalDate : 날짜를 표현하는 데 사용하는 클래스
  • LocalTime : 시간을 표현하는 데 사용하는 클래스
  • LocalDateTime : 날짜와 시간을 결합한 클래스

왜 java.time 패키지를 사용해야 하는가

  • util.Date 클래스는 변하기 쉬운( mutable ) 클래스이기 때문에 스레드 안전 ( thread safe ) 하지 않다.
    여러 작업이 동작하면서 내가 예상치 못하게 다른 스레드에서 그 값을 수정하여 다른 값이 전달될 가능성이 있기 때문에 java.time 패키지의 클래스들을 사용해야 한다.
  • 월이 0부터 시작하는 등의 불편함을 가지고 있다.

Calendar, SimpleDateFormat

Calendar와 SimpleDateFormat을 사용하여 다양한 일자를 계산하는 방법이다.

 

일자 구하기

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(cal.getTime());

기본적으로 Calendar와 SimpleDateFormat은 다음과 같이 사용한다.

SimpleDateFormat은 필요한 format을 정의하여 사용하면 된다.

yyyyMMdd
yyyy-MM-dd

 

Calendar 현재 시간정보

Calendar cal = Calendar.getInstance();  // 현재 시간정보 가지고오기

 

Calendar 임의 일자 설정

String bseDt = "20230219";
cal.set(Calendar.YEAR, Integer.parseInt(bseDt.substring(0, 4)));  //년 설정
cal.set(Calendar.MONTH, Integer.parseInt(bseDt.substring(4, 6)) - 1);  //월 설정
cal.set(Calendar.DATE, Integer.parseInt(bseDt.substring(6, 8)));  //일 설정

월 정보를 설정할 때 주의해야 한다. 

Calendar.MONTH의 값은 0 ~ 11이기 때문에 1을 빼주어야 한다.

 

Calendar 일자 더하기

cal.add(Calendar.YEAR, 1);  //현재 시간에 + 1년
cal.add(Calendar.MONTH, 1); //현재 시간에 + 1월
cal.add(Calendar.DATE, 1); //현재 시간에 + 1일

Calendar 초일, 말일 구하기

cal.getActualMinimum(Calendar.DAY_OF_MONTH);  //초일
cal.getActualMaximum(Calendar.DAY_OF_MONTH);  //말일

 

윤년 구하기

Calendar cal = Calendar.getInstance();
String bseDt = "20230219";
cal.set(Calendar.YEAR, Integer.parseInt(bseDt.substring(0, 4)));
cal.set(Calendar.MONTH, Integer.parseInt(bseDt.substring(4, 6)) - 1);
cal.set(Calendar.DATE, Integer.parseInt(bseDt.substring(6, 8)));

if(cal.getActualMaximum(Calendar.DAY_OF_MONTH) == 29) {
	System.out.println("윤년 입니다.");
}else {
	System.out.println("윤년이 아닙니다.");
}

getActualMaximum 메소드를 이용하여 윤년을 계산할 수 있다.

2월의 마지막일은 28일 또는 29일이다.


일자 계산은 공통으로 사용하기 때문에 보통 Util로 만들어서 사용한다.

Util은 보통 객체를 생성하여 사용하지 않기때문에 생성자를 사용하지 못하도록 해주어야한다.

생성하여 사용하지 않기때문에 메소드를 static으로 선언해야한다는 것에 주의하자.

 

DateUtil.java

public class DateUtil {

	private static String DATE_FORMAT = "yyyyMMdd";
	private static SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
	
    /*생성자 사용하지 못하도록*/
	public DateUtil () {}
	
	/*오늘일자*/
	public static String getDay() {
		Calendar cal = Calendar.getInstance();
		return sdf.format(cal.getTime());
	}
	/*내일*/
	public static String getNextDay() {
		return afterDay(getDay(), 1);
	}
	/*일자 더하기*/
	public static String afterDay(String bseDt, int addDay) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, addDay);
		return sdf.format(cal.getTime());
	}
	/*월 더하기*/
	public static String afterMonthDay(String bseDt, int addMonth) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.MONTH, addMonth);
		return sdf.format(cal.getTime());
	}
	/*월 초일*/
	public static String firstDayOfMonth(String bseDt) {
		Calendar cal = getCalendar(bseDt);
		cal.set(Calendar.DATE, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		
		return sdf.format(cal.getTime());
	}
	/*월 말일*/
	public static String lastDayOfMonth(String bseDt) {
		Calendar cal = getCalendar(bseDt);
		cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		
		return sdf.format(cal.getTime());
	}
	/*전월 말일*/
	public static String beforeMonthLastDay(String bseDt) {
		String beforeMonthBseDt = afterMonthDay(bseDt, -1);
		Calendar cal = getCalendar(beforeMonthBseDt);
		cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		
		return sdf.format(cal.getTime());
	}
	/*다음달 말일*/
	public static String afterMonthLastDay(String bseDt) {
		String afterMonthBseDt = afterMonthDay(bseDt, 1);
		Calendar cal = getCalendar(afterMonthBseDt);
		cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		
		return sdf.format(cal.getTime());
	}
	/*년 초일*/
	public static String firstDayOfYear(String bseDt) {
		Calendar cal = getCalendar(bseDt.substring(0, 4), "01", "01");
		return sdf.format(cal.getTime());
	}
	/*년 말일*/
	public static String LastDayOfYear(String bseDt) {
		Calendar cal = getCalendar(bseDt.substring(0, 4), "12", "31");
		return sdf.format(cal.getTime());
	}
	/*윤년 체크*/
	public static boolean leapYearCheck(String bseDt) {
		Calendar cal = getCalendar(bseDt.substring(0, 4), "02", "01");
		if(cal.getActualMaximum(Calendar.DAY_OF_MONTH) == 29) {
			return true;
		}else {
			return false;
		}
	}
	/*- format*/
	public static String dashFormat(String bseDt) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = getCalendar(bseDt);

		return sdf.format(cal.getTime());
	}

	private static Calendar getCalendar(String year, String month, String day) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(year));
		cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
		cal.set(Calendar.DATE, Integer.parseInt(day));
		return cal;
	}
	
	private static Calendar getCalendar(String bseDt) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(bseDt.substring(0, 4)));
		cal.set(Calendar.MONTH, Integer.parseInt(bseDt.substring(4, 6)) - 1);
		cal.set(Calendar.DATE, Integer.parseInt(bseDt.substring(6, 8)));
		return cal;
	}
	
}

Test

System.out.println(String.format("오늘 : %s", DateUtil.getDay()));
System.out.println(String.format("내일 : %s", DateUtil.getNextDay()));
System.out.println(String.format("몇 일 후 : %s", DateUtil.afterDay(DateUtil.getDay(), 5)));
System.out.println(String.format("몇 월 후 : %s", DateUtil.afterMonthDay(DateUtil.getDay(), -2)));
System.out.println(String.format("월 초일 : %s", DateUtil.firstDayOfMonth(DateUtil.getDay())));
System.out.println(String.format("월 말일 : %s", DateUtil.lastDayOfMonth(DateUtil.getDay())));
System.out.println(String.format("전월 말일 : %s", DateUtil.beforeMonthLastDay(DateUtil.getDay())));
System.out.println(String.format("다음달 말일 : %s", DateUtil.afterMonthLastDay(DateUtil.getDay())));
System.out.println(String.format("년초일 : %s", DateUtil.firstDayOfYear(DateUtil.getDay())));
System.out.println(String.format("년말일 : %s", DateUtil.LastDayOfYear(DateUtil.getDay())));
System.out.println(String.format("윤년 체크: %s", DateUtil.leapYearCheck(DateUtil.getDay())));
System.out.println(String.format("윤년 체크: %s", DateUtil.leapYearCheck("20240101")));
System.out.println(String.format("[-] format: %s", DateUtil.dashFormat(DateUtil.getDay())));

Output

오늘 : 20230219
내일 : 20230220
몇 일 후 : 20230224
몇 월 후 : 20221219
월 초일 : 20230201
월 말일 : 20230228
전월 말일 : 20230131
다음달 말일 : 20230331
년초일 : 20230101
년말일 : 20231231
윤년 체크: false
윤년 체크: true
[-] format: 2023-02-19
반응형

관련글 더보기

댓글 영역

>