💡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초