자바 8 이상의 버전을 사용하고 있다면 java.time 패키지를 사용하는 것이 바람직하다.
자바 8 이하를 사용하고 있다면 Calendar를 사용하고 8이상이라면 LocalDate, LocalTime, LocalDateTime을 사용하도록 하자.
LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기
java.time 패키지
왜 java.time 패키지를 사용해야 하는가
Calendar와 SimpleDateFormat을 사용하여 다양한 일자를 계산하는 방법이다.
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(cal.getTime());
기본적으로 Calendar와 SimpleDateFormat은 다음과 같이 사용한다.
SimpleDateFormat은 필요한 format을 정의하여 사용하면 된다.
yyyyMMdd
yyyy-MM-dd
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))); //일 설정
월 정보를 설정할 때 주의해야 한다.
Calendar.MONTH의 값은 0 ~ 11이기 때문에 1을 빼주어야 한다.
cal.add(Calendar.YEAR, 1); //현재 시간에 + 1년
cal.add(Calendar.MONTH, 1); //현재 시간에 + 1월
cal.add(Calendar.DATE, 1); //현재 시간에 + 1일
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으로 선언해야한다는 것에 주의하자.
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;
}
}
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())));
오늘 : 20230219
내일 : 20230220
몇 일 후 : 20230224
몇 월 후 : 20221219
월 초일 : 20230201
월 말일 : 20230228
전월 말일 : 20230131
다음달 말일 : 20230331
년초일 : 20230101
년말일 : 20231231
윤년 체크: false
윤년 체크: true
[-] format: 2023-02-19
[JAVA] 접근제어자 및 Protected에 대한 고찰 (15) | 2023.03.14 |
---|---|
[JAVA] Custom Annotation 생성 및 활용 (5) | 2023.03.05 |
[JAVA] File Object 기본 사용법 (9) | 2023.02.18 |
JAVA 업캐스팅, 다운캐스팅, instanceof 연산자 (0) | 2022.10.17 |
[JAVA] Comparable과 Comparator (0) | 2022.07.19 |
댓글 영역