자바 7 일전 - jaba 7 iljeon

import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class DateUtils {

    // 현재 날짜
    public static String getToday(){
        DecimalFormat df = new DecimalFormat("00");
        Calendar currentCalendar = Calendar.getInstance();
        String strYear = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth = df.format(currentCalendar.get(Calendar.MONTH) + 1);
        String strDay = df.format(currentCalendar.get(Calendar.DATE));
        String strDate = strYear + "-" + strMonth  + "-" + strDay;
        return strDate;
    }

    // 한달 전
    public static String getMonthAgo() {
        DecimalFormat df = new DecimalFormat("00");
        Calendar currentCalendar = Calendar.getInstance();
        currentCalendar.add(currentCalendar.MONTH, -1);
        String strYear31 = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth31 = df.format(currentCalendar.get(Calendar.MONTH) + 1);
        String strDay31 = df.format(currentCalendar.get(Calendar.DATE));
        String strDate31 = strYear31 + "-" + strMonth31 + "-" + strDay31;
        return strDate31;
    }

    // 일주일 전
    public static String getWeekAgo() {
        DecimalFormat df = new DecimalFormat("00");
        Calendar currentCalendar = Calendar.getInstance();
        currentCalendar.add(currentCalendar.DATE, -7);
        String strYear7 = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth7 = df.format(currentCalendar.get(Calendar.MONTH) + 1);
        String strDay7 = df.format(currentCalendar.get(Calendar.DATE));
        String strDate7 = strYear7 + "-" + strMonth7 + "-" + strDay7;
        return strDate7;
    }

    // 하루 전
    public static String getDayAgo() {
        DecimalFormat df = new DecimalFormat("00");
        Calendar currentCalendar = Calendar.getInstance();
        currentCalendar.add(currentCalendar.DATE, -1);
        String strYear7 = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth7 = df.format(currentCalendar.get(Calendar.MONTH) + 1);
        String strDay7 = df.format(currentCalendar.get(Calendar.DATE));
        String strDate7 = strYear7 + "-" + strMonth7 + "-" + strDay7;
        return strDate7;
    }

    // 일 계산
    public static String getCalculateDay(String date, int day) {
        DecimalFormat df = new DecimalFormat("00");
        String[] dateArr = date.split("-");
        Calendar currentCalendar = new GregorianCalendar(Integer.parseInt(dateArr[0]), Integer.parseInt(dateArr[1]), Integer.parseInt(dateArr[2]));
        currentCalendar.add(currentCalendar.DATE, day);
        String strYear7 = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth7 = df.format(currentCalendar.get(Calendar.MONTH));
        String strDay7 = df.format(currentCalendar.get(Calendar.DATE));
        String strDate7 = strYear7 + "-" + strMonth7 + "-" + strDay7;
        return strDate7;
    }

    // 월 계산
    public static String getCalculateMonth(String date, int month) {
        DecimalFormat df = new DecimalFormat("00");
        String[] dateArr = date.split("-");
        Calendar currentCalendar = new GregorianCalendar(Integer.parseInt(dateArr[0]), Integer.parseInt(dateArr[1]), Integer.parseInt(dateArr[2]));
        currentCalendar.add(currentCalendar.MONTH, month);
        String strYear7 = Integer.toString(currentCalendar.get(Calendar.YEAR));
        String strMonth7 = df.format(currentCalendar.get(Calendar.MONTH));
        String strDay7 = df.format(currentCalendar.get(Calendar.DATE));
        String strDate7 = strYear7 + "-" + strMonth7 + "-" + strDay7;
        return strDate7;
    }
}

바로 이전에 이야기 했던 것 처럼, 서비스를 위해서는 오늘 날짜를 구해서 사용하는 경우가 많습니다. 이때는 Date Class를 통해서 구할 수 있지만 사용자의 원하는 형태로 변경을 위해서 SimpleDateFormat Class를 사용하게 됩니다. 하지만 꼭 오늘 날짜만 필요한것이 아니고 상황에 따라서는 어제 날짜를 구해서 사용해야 할 때가 있고, 어떤 경우에는 지정한 날짜 만큼 이전의 날짜를 구해서 사용해야 할 경우도 발생합니다.

 

그래서 이번에는 Calendar Class를 통해서 이를 해결하는 방법에 대해서 알아보도록 하겠습니다. 경우는 2가지가 있을 것 같습니다.

 

  1. Calendar를 통해서 오늘날짜를 가져와서 어제 날짜를 구하거나, 지정한 날짜 만큼 이전의 날짜를 구하는 경우
  2. String형태의 날짜를 기준으로 이전, 이후의 날짜를 구하는 경우

 

두가지 모두 언제든 발생할 수 있기 때문에, 모두 알아보도록 하겠습니다.

 

 

1. Class Calendar ?


Calendar의 구조는 아래와 같습니다.

java.lang.Object
    java.util.Calendar

이 Class는 1970년1월1일 00:00:00.000GMT (Gregorian)을 기준으로 ms(milliseconds)를 기준으로 현재시간을 변환한 값을 기준으로 동작하게 됩니다. 이를 기준으로 year, month, day 등과 같은 달력에서 보여지는 값으로 변경하고, 어제 날짜... 다음주 날짜 등을 얻어오는 등의 method를 제공하는 녀석입니다.

 

날짜를 가지고 조작하는 왠만한 것들을 가능하게 해주는 녀석이라고 생각이 되네요.

 

여기서 제공하는 method는 상당히 많습니다. 자세한 내용은 아래의 표 출처를 통해서 확인하셔서 사용하시면 됩니다. 주로 사용하는 것들을 몇가지 정리해 보겠습니다. 

TypeMethod설명abstract voidadd- Calendar를 기준으로 날짜의 이전, 이후에 대한 날짜를 구할 수 있음intcompareTo- 현재 Calendar를 기준으로 parameter로 들어오는 Calendar가 더 이전 날짜면
  (+), 이후 날짜면 (-), 같으면 (0) 을 returnstatic CalendargetInstance- 기본 timezone과 locale이 적용된 Calendar를 returnlonggetTimeInMillis- milliseconds기준으로 시간을 returnintgetWeekYear- Calendar 의 년도를 return

[출처 : docs.oracle.com/javase/7/docs/api/java/util/Calendar.html]

그럼 한번 사용해 보겠습니다.

 

 

2. Calendar를 통해서 어제 날짜 구하기


우선 Calendar 객체를 생성하면 어떤 데이터가 들어가 있는지 확인해 보겠습니다. 

 

[CalendarTest.class]

import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarTest {

	public static void main(String[] args) {

		Calendar calendar = new GregorianCalendar();
		System.out.println(calendar);

	}

}

[결과]

java.util.GregorianCalendar
[time=1620444172798,areFieldsSet=true,areAllFieldsSet=true,lenient=true,
 zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,
 transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=4,
 WEEK_OF_YEAR=19,WEEK_OF_MONTH=2,DAY_OF_MONTH=8,DAY_OF_YEAR=128,DAY_OF_WEEK=7,
 DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=22,SECOND=52,MILLISECOND=798,
 ZONE_OFFSET=32400000,DST_OFFSET=0]

엄청난 정보들이 해당 Calendar에 들어가 있습니다. 위에서 알아본 method이외에 대다수의 method는 해당 값들을 적절하게 가져오기 위해서 구성되어 있습니다. 

 

그럼 제공하는 method중에서 add( )를 사용해서 어제 날짜를 구해보도록 하겠습니다. 

 

[CalendarTest.class]

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

public class CalendarTest {

	public static void main(String[] args) {

		Calendar calendar = new GregorianCalendar();
		SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
		
		String chkDate = SDF.format(calendar.getTime());		
		System.out.println("Today : " + chkDate);
		
		calendar.add(Calendar.DATE, -1);		
		chkDate = SDF.format(calendar.getTime());		
		System.out.println("Yesterday : " + chkDate);
		
		calendar.add(Calendar.DATE, -9);
		chkDate = SDF.format(calendar.getTime());		
		System.out.println("The day before 10days : " + chkDate);

	}

}

[결과]

Today : 2021-05-08
Yesterday : 2021-05-07
The day before 10days : 2021-04-28

calendar 에서 제공하는 method중에는 위에서 언급한 add( ) method가 있습니다. 이를 통해서 이전 혹은 이후 날짜를 기준날짜로 부터 가져올 수가 있습니다. Calendar.DATE를 통해서 오늘 날짜를 가져와서 add( )의 첫번째 parameter로 지정하고 이전 혹은 이후로 옮기고 싶은 수 많큼 Integer를 입력해서 이동을 시키면 됩니다.

 

위의 예시에서는 (-1)로 어제 날짜를 구하고, 추가적으로 (-9)를 해줌으로써, 10일전 날짜를 구했습니다. 이 모든 날짜에 대한 이동은 Calendar를 기준으로 하기 때문에... 알아서 해당 월을 변경하면서 이동합니다.

 

 

3. String 입력을 통해서 내일 날짜 구하기


이번에는 기준일을 String을 통해서 입력을 받고, 이 String을 기준으로 내일 날짜를 구해보도록 하겠습니다. String을 아무래도 Date로 변경해주고 이를 Calendar로 만들어줘야 무언가를 할 수 있겠죠?? 왜냐하면, 현재 구현되는 날짜의 이동을 Calendar를 기준으로 add( ) method를 통해서 구현되기 때문입니다.

 

[CalendarTest.class]

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

public class CalendarTest {

	public static void main(String[] args) {
		
		String inputDate = "20210508";
		SimpleDateFormat SDFin = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat SDFout = new SimpleDateFormat("yyyy-MM-dd");
		
		Date chgInputDate = null;
		try {
			chgInputDate = SDFin.parse(inputDate);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(chgInputDate);
		calendar.add(Calendar.DATE, 2);
		String chkDate = SDFout.format(calendar.getTime());
		System.out.println("The day after 2days : " + chkDate);
	}

}

[결과]

The day after 2days : 2021-05-10

위에 간단하게 언급한 것처럼, 우선 String으로 받은 입력을 Date형태로 바꾸어 주어야 합니다. 그래야 Calendar에 그 String으로 입력받은 날짜를 기준으로 설정이 가능합니다. 이를 위해서는 SimpleDateFormat을 통해서 String을 Date로 바꿔줍니다.

 

바꾸는데 error가 발생할 수 있기 때문에 try{ }catch{ }로 감싸줍니다. 사실은 이렇게 구현되지 않으면 eclipse에서는 친철하고 오류를 알려줍니다. 이렇게 Date로 변환이 완료되었다면, Calendar 인스턴스를 하나 생성해 줍니다. getInstance( )로 생성이 가능합니다.

 

이렇게 인스턴스까지 생성이 되었다면 setTime을 통해서 이전에 String을 통해서 변경한 Date를 Calendar에 기준점으로 설정해주게 됩니다. 이게 뒤는 add( ) method를 통해서 2일 이후의 날짜를 구하는 로직이고, String으로 다시 변경해주어 출력을 해주는 예시입니다.