본문 바로가기
Java/Java

API) 시각 정보를 가져오는 Calendar, Date

by 박채니 2022. 3. 28.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


☞ Calendar

캘린더 객체 생성 방법 1) Calendar.getInstance();

Calendar today = Calendar.getInstance();

캘린더는 추상 클래스이기 때문에 직접 객체화를 할 수 없습니다.

따라서 객체 생성 없이 가져올 수 있는 static 메소드인 getInstance()를 통해서 날짜 정보를 가져올 수 있습니다.

Calendar today = Calendar.getInstance();
System.out.println(today);

@콘솔출력값
java.util.GregorianCalendar[time=1648186481728,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=2022,MONTH=2,WEEK_OF_YEAR=13,WEEK_OF_MONTH=4,DAY_OF_MONTH=25,DAY_OF_YEAR=84,
DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=34,SECOND=41,
MILLISECOND=728,ZONE_OFFSET=32400000,DST_OFFSET=0]

날짜 정보를 담은 today를 출력해봤더니... 엄청난 출력결과를 가져왔습니다.

잘 살펴보면.. YEAR = 2022, MONTH = 2, DAY_OF_MONTH = 25, DAY_OF_WEEK = 6 등등.. 오늘 날짜 정보를 알 수 있긴 합니다.

 

여기서! time = 1648186481728은 unix second(time) / epoch time으로 1970/01/01 00:00:00 이후로 흐른 밀리초를 나타낸 것입니다. 자주 사용한다고 하니 어떤 것을 나타낸 숫자인 지 알고 있는 게 좋겠습니다.

 

참고로 오늘은 2022년 3월 25일인데, MONTH에는 3이 아닌 2가 출력된 것을 확인할 수 있습니다.

그 이유는, Calendar는 월을 0~11로 인식하기 때문입니다. 따라서 추후 월을 출력할 때는 반드시 +1을 해줘야겠죠.

 

또, DAY_OF_WEEK는 요일을 나타내는 숫자인데 일(1) ~ 토(7)로 표현해줍니다.

따라서 오늘은 금요일이므로 6이 출력된 것을 확인할 수 있습니다.

 

이 Calendar 객체를 이용하여 오늘의 날짜와 시각 정보를 출력해보겠습니다.

Calendar today = Calendar.getInstance();
	
char[] DAY_OF_WEEK = {'일', '월', '화', '수', '목', '금', '토'};

System.out.println(today.get(Calendar.YEAR));
System.out.println(today.get(Calendar.MONTH) + 1);
System.out.println(today.get(Calendar.DAY_OF_MONTH));
System.out.println(DAY_OF_WEEK[today.get(Calendar.DAY_OF_WEEK)]);
System.out.println(today.get(Calendar.AM_PM) == 0 ? "오전" : "오후");
System.out.println(today.get(Calendar.HOUR));
System.out.println(today.get(Calendar.MINUTE));
System.out.println(today.get(Calendar.SECOND));

사용한 YEAR, MONTH, DAY_OF_WEEK.. 등등 모두 static 메소드이므로 클래스명. 으로 메소드를 불러왔습니다.

 

캘린더 객체 생성 방법 2) new GregorianCalendar();

Calendar today = new GregorianCalendar();
		
char[] DAY_OF_WEEK = {'일', '월', '화', '수', '목', '금', '토'};

System.out.println(today.get(Calendar.YEAR));
System.out.println(today.get(Calendar.MONTH) + 1);
System.out.println(today.get(Calendar.DAY_OF_MONTH));
System.out.println(DAY_OF_WEEK[today.get(Calendar.DAY_OF_WEEK)]);
System.out.println(today.get(Calendar.AM_PM) == 0 ? "오전" : "오후");
System.out.println(today.get(Calendar.HOUR));
System.out.println(today.get(Calendar.MINUTE));
System.out.println(today.get(Calendar.SECOND));

@콘솔출력값
2022
3
25
토
오후
2
45
58

GregorianCalendar()는 Calendar 추상 클래스의 자식 클래스입니다.

따라서 객체를 생성하고 동일한 코드를 사용하여 오늘 날짜/시각을 출력하였습니다.

 

특정 시각 정보를 가진 객체 만드는 방법 1) setter 사용

2022/3/29

Calendar cal1 = Calendar.getInstance();
cal1.set(2022, 3-1, 29);
System.out.println(cal1);

@콘솔출력값
java.util.GregorianCalendar[time=?,areFieldsSet=false,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=2022,MONTH=2,
WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=87,DAY_OF_WEEK=2,
DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=52,SECOND=25,MILLISECOND=285,
ZONE_OFFSET=32400000,DST_OFFSET=0]

setter 메소드를 이용하여 특정 시각 정보를 가진 객체를 만들어주었습니다.

다만, set을 사용하게 된다면 시/분/초 등 다른 정보는 현재 시각을 기준으로 세팅이 되기 때문에 정확하지 않은 정보를 가져올 수도 있습니다.

또한, 월은 컴퓨터에서 0~11월까지로 인식하므로 구하려고 하는 월에 -1 처리를 해줘야 합니다.

Calendar cal1 = Calendar.getInstance();
cal1.set(2022, 3-1, 29, 0, 0, 0);
System.out.println(cal1);

@콘솔출력값
java.util.GregorianCalendar[time=?,areFieldsSet=false,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=2022,MONTH=2,
WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=87,DAY_OF_WEEK=2,
DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=843,
ZONE_OFFSET=32400000,DST_OFFSET=0]

나머지 정보가 현재 시각을 가리키므로 0으로 세팅해주었습니다. 다만 밀리초는 수정이 불가..(한계점)

 

특정 시각 정보를 가진 객체 만드는 방법 2) 생성자 사용

2022/3/29

Calendar cal2 = new GregorianCalendar(2022, 3-1, 29);
System.out.println(cal2);

@콘솔출력값
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,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=?,YEAR=2022,MONTH=2,
WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=29,DAY_OF_YEAR=?,DAY_OF_WEEK=?,
DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,
ZONE_OFFSET=?,DST_OFFSET=?]

생성자를 사용하면 세팅한 시각 정보 이외 정보는 모두 0 혹은 ?로 처리 되어 더 정확하게 시각 정보를 입력할 수 있습니다.

 

dday 시각 구하기

2022/3/28일 기준 2022/3/31일까지

Calendar cal2 = new GregorianCalendar(2022, 3-1, 31);
		
//dday구하기
//3월 28일 기준, 3월 31일까지 dday(d-3)
//미래날짜의 밀리초 - 과거날짜의 밀리초 -> 일단위 환산
long ddayMillis = cal2.getTimeInMillis();
long nowMillis = Calendar.getInstance().getTimeInMillis();
long millis = ddayMillis - nowMillis;
double diff = (double) millis / 1000 / 60 / 60 / 24;	//1000(초) -> 60(분) -> 60(시) -> 24(일)
		
System.out.printf("미래날짜 밀리초 %s - 현재날짜 밀리초 %s = %s\n", ddayMillis, nowMillis, millis);
System.out.printf("오늘은 D-%s일 입니다.", (int)Math.ceil(diff));

미래 날짜와 현재 날짜의 밀리초 차이를 구한 후 밀리초를 일 단위로 환산 시켜주었습니다.

3월 28일 즉 현재 날짜도 dday계산에 포함되어야 하기 때문에 double형으로 받아 올림 처리 해주었습니다.

 

  올림, 반올림, 내림처리
 * Math.ceil():double 올림
 * Math.round():long 반올림
 * Math.floor():double 내림


☞ Date

Date 클래스에서 현재 사용할 수 있는 생성자

- Date()

- Date(millis:long)

두 개만 사용할 수 있고, 나머지는 모두 Deprecated 사용 불가합니다.

 

Calendar to Date

Calendar cal1 = new GregorianCalendar();
Date date = new Date(cal1.getTimeInMillis());
System.out.println(date);

@콘솔출력값
Mon Mar 28 11:15:30 KST 2022

Date에 Calendar의 밀리초를 넘겨주었습니다.

 

Date to Calendar

Date date2 = new Date();
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
System.out.println(cal2);

@콘솔출력값
java.util.GregorianCalendar[time=1648434062791,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=2022,MONTH=2,WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=28,DAY_OF_YEAR=87,
DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=21,SECOND=2,
MILLISECOND=791,ZONE_OFFSET=32400000,DST_OFFSET=0]

Calendar 객체에 Date를 받는 setTime()메소드를 이용하여 Date가 갖고 있는 시각 정보를 넘겨주었습니다.

LIST