Programming/Java

[Java] 날짜시간 자료형: Date 클래스, Calendar 클래스, 형식 문자, SimpleDateFormat 클래스

Isaac S. Lee 2023. 7. 20. 17:48

💡Date 클래스


Date date = new Date();

System.out.println(date);

Date 클래스는 실제 표준 시가 아닌 컴퓨터의 시각을 가져온다. 따라서 사용자가 컴퓨터의 시간을 변경하면 출력하는 날짜 또한 바뀌게 된다.

이 시간은 대략적으로 신뢰할 수는 있지만, 시간을 정각에 맞춰야 하는 일이 있을 경우에는 사용하지 않는 것이 좋다.

 

💡Calendar 클래스


Calendar c1 = Calendar.getInstance();

System.out.println(c1);
/*
    java.util.GregorianCalendar[time=1689838475429,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=2023,MONTH=6,WEEK_OF_YEAR=29,WEEK_OF_MONTH=4,DAY_OF_MONTH=20
    ,DAY_OF_YEAR=201,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=34,SECOND=35
    ,MILLISECOND=429,ZONE_OFFSET=32400000,DST_OFFSET=0]
*/

Calendar 클래스는 추상 클래스이기 때문에 일반 클래스처럼 객체를 생성할 수 없다.

따라서 Calendar c1 = Calendar.getInstance(); 에서 Calendar 클래스의 static 메소드 getInstance()를 호출해야 Calendar 클래스를 상속한 객체가 생성되어 리턴받는 과정이 필요하다.

 

Calendar 클래스는 집합 데이터로서 내가 원하는 항목만 추출할 수 있다는 특징이 있다.

어떤 항목을 추출할지에 따라 필요한 숫자가 있는데, 이를 Calendar에서 상수로 제공하여 Calendar 상수라고 부른다.

 

System.out.println(c1.get(Calendar.YEAR));			// 년도
System.out.println(c1.get(Calendar.MONTH));			// * 1월이 아니라 0부터 시작한다.
System.out.println(c1.get(Calendar.DATE));			// 일
System.out.println(c1.get(Calendar.HOUR));			// 4 > 시(12H)
System.out.println(c1.get(Calendar.HOUR_OF_DAY));	// 16 > 시(24H)
System.out.println(c1.get(Calendar.MINUTE));		// 분
System.out.println(c1.get(Calendar.SECOND));		// 초
System.out.println(c1.get(Calendar.MILLISECOND));	// ms, 1/1000초(자바 시간 최소 단위) 10억분의 1도 가능하지만 특수한 경우이다.
System.out.println(c1.get(Calendar.AM_PM));			// 오전(0), 오후(1)
System.out.println(c1.get(Calendar.DAY_OF_YEAR));	// 올해까지 일
System.out.println(c1.get(Calendar.DAY_OF_MONTH));	// 이번달까지 일
System.out.println(c1.get(Calendar.DAY_OF_WEEK));	// 요일, 1(일) ~ 7(토) (메소드 반환값이 Integer라서 숫자로 나온다.)
System.out.println(c1.get(Calendar.WEEK_OF_YEAR));	// 올해까지 주차
System.out.println(c1.get(Calendar.WEEK_OF_MONTH));	// 이번달까지 주차
System.out.printf("지금은 %s %d시 %02d분 %d초 입니다.\n"
				, c1.get(Calendar.AM_PM) == 0 ? "오전" : "오후"
				, c1.get(Calendar.HOUR)
				, c1.get(Calendar.MINUTE)
				, c1.get(Calendar.SECOND));

Calendar 상수를 이용하여 "지금은 오후 5시 05분 50초 입니다."를 출력할 경우, 위와 같이 코드를 작성할 수 있다.

AM_PM을 사용해 오전과 오후를 출력하고자 할 때, AM은 0, PM은 1로 출력되므로 3항연산자를 사용해 수정해 주었다.

 

💡형식 문자


System.out.printf("%tF\n", c1); // 2023-07-20
		
System.out.printf("%tT\n", c1); // 17:17:36

System.out.printf("%tA\n", c1); // 목요일

printf() 날짜시간과 관련한 형식 문자를 사용하면 훨씬 간결하게 날짜시간을 표현할 수 있다.

tF: 년-월-일

tT: 시-분-초

tA: 요일

 

💡날짜 수정


set() 메소드

christmas.set(Calendar.MONTH, 11);
christmas.set(Calendar.DATE, 25);
christmas.set(Calendar.HOUR_OF_DAY, 19);
christmas.set(Calendar.MINUTE, 0);
christmas.set(Calendar.SECOND, 0);

int field: the given calendar field.
int value: the value to be set for the given calendar field.

 

get() 메소드가 데이터를 가져온다면, set() 메소드는 수정하는 작업을 한다.

field는 수정하려는 게 년도인지, 월인지, 일인지 알려주기 위한 것이고, value는 수정하는 값이다.

 

MONTH를 사용할 때 주의해야 할 점은 월은 0 ~ 11를 입력해야 1 ~ 12를 나타낼 수 있다는 것이다.

12는 내년 1월을 의미하므로, 12월을 나타내려면 11을 입력해야 한다.

 

Calendar birthday = Calendar.getInstance();
		
birthday.set(1999, 4, 27);
System.out.printf("birthday: %tF\n", birthday);

birthday.set(1999, 4, 27, 10, 30);
System.out.printf("birthday: %tF\n", birthday);

 

add() 메소드

100일 이후의 날짜

Calendar now = Calendar.getInstance();
		
System.out.printf("1일차: %tF\n", now); // 1일차: 2023-07-20

now.add(Calendar.DATE, 100);

System.out.printf("100일차: %tF\n", now); // 100일차: 2023-10-28

오늘로부터 100일 이후의 날짜가 알고 싶다면 Add() 메소드를 사용하면 된다.

 

10일 전의 날짜

now = Calendar.getInstance();
		
now.add(Calendar.DATE, -10);

System.out.printf("10일 전: %tF\n", now);

Add() 메소드는 날짜를 더하는 것 외에도 빼는 기능도 있다.

이를 활용하여 특정 날짜를 기준으로 며칠 전이 언제인지를 출력하는 것이 가능하다.

 

특정 시간 경과 후의 시간 계산

now = Calendar.getInstance();
		
now.add(Calendar.HOUR, 3);
now.add(Calendar.MINUTE, 30);

System.out.printf("3시간 30분 뒤: %tF\n", now);

날짜뿐만 아니라 시간을 더하거나 빼는 것 또한 가능하다.

 

💡SimpleDateFormat 클래스


Calendar currentDate = Calendar.getInstance();
		
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy년 M월 d일 E요일 HH시 mm분 ss초");
System.out.println(dateFormat.format(currentDate.getTime()));

Calendar 클래스에 SimpleDateFormat 클래스를 조합하면 위와 같이 간결하게 처리할 수 있다.

출력 예시: 2023년 7월 21일 금요일 06시 10분 02초