자바에는 시간, 날짜를 제공하는 클래스가 여럿 있다.
대표적으로는 Date, Calendar, Time이 있다고 한다.
과거에 사용되던 Date, Calendar 클래스(java.util)는 사용이 불편하고 문제가 좀 있어서
요즘에는 java.time의 LocalDate, LocalTime, LocalDateTime을 쓰는 추세라고 한다.
Date는 아주 간단하게만 보고 넘어가자. 현재는 대부분 deprecate 되었다.
Date date = new Date();
System.out.println(date.toString()); // Sun Feb 05 16:49:10 KST 2023 이런식으로 나온다.
원하는 형태로 출력하기 위해 java.util.SimpleDateFormat 클래스를 이용하면 된다.
Calendar는 Date이후에 나온 것으로 상호변환될 수 있다. 간단하게만 기록하고, 자세히 쓸일이 있으면 보강하기로 하자.
Calendar c1 = Calendar.getInstance(); //추상클래스라 new를 통해서 만들 수 없다.
cal.add(Calendar.MONTH, 1); // 현재날짜에 원하는 만큼 연산이 가능
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1; // 월은 0부터 시작한다.
int date = cal.get(Calendar.DATE);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
Date, Calender 클래스는 불변 객체가 아니기 때문에 Calendar 객체나 Date 객체가 여러 객체에서 공유되면 한 곳에서 바꾼 값이 다른 곳에 영향을 미치는 부작용이 생길 수 있다고 한다. 이외에도 여러 문제가 있다고 한다.
그래서 java 8 부터 추가된 java.time 패키지의 LocalDate, LocalTime, LocalDateTime, ZonedDateTime을 쓴다고 한다. Local이라는 단어에서 알 수 있듯이 여러 지역대의 Timezone id는 포함하지 않는다. global time까지 고려한다면 timezone이 추가된 ZonedDateTime을 사용한다고 한다.(이건 나중에)
LocalDate (날짜)
날짜를 표현하는 클래스다.
LocalDate today = LocalDate.now(); // 2023-02-05
LocalDate targetDay = LocalDate.of(2022, 1, 30); // 2022-01-30
Calendar와 달리 month의 상수값이 우리가 생각하는 그것과 같다.
주로 사용하는 방식
목표 | 사용 예시 | 설명 |
오늘 날짜 가져오기 | LocalDate today = LocalDate.now(); | 오늘날짜를 가져온다. |
원하는 날짜 가져오기 | LocalDate targetDate = LocalDate.of(2022, 1, 30); | 원하는 날짜를 인자로 주면 가져온다. |
원하는 달의 마지막 날짜 가져오기 | int lastDate = targetDate.lengthOfMonth(); | lengthOfMonth()를 통해 해당 month의 마지막 날을 가져온다.(이를 of의 인자로 넣어도 된다.) |
원하는 날짜의 요일 가져오기 | dayOfWeek = targetDate.getDayOfWeek().getValue(); | 원하는 날짜가 무슨 요일인지를 가져올 수 있다. DayOfWeek 열거체는 "MONDAY"와 같이 영어로 구성되어 있다. getValue()를 붙임으로써 int값으로 가져올 수 있다.(월요일=1, 일요일=7) |
LocalTime (시간)
시간을 표현하는 클래스다.
LocalTime curTime = LocalTime.now(); // 17:14.28.119
LocalTime targetTime = LocalTime.of(16, 1, 27); // 16:01:27 인자를 4개까지 쓸 수 있는데
//마지막 인자는 nano시간을 표현한다.
LocalDateTime (날짜 + 시간)
날짜와 시간을 동시에 표현하는 클래스다.
now()를 통해 현재날짜, 시간, of()를 통해 원하는 날짜, 시간을 가져올 수 있다는 것을 기억하자.
특정 필드값을 가져올 때는 get()을 쓴다고 한다.(LocalDate, LocalTime도 동일)
LocalDateTime curDateTime = LocalDateTime.now(); // 2023-02-05T17:15:38.309
LocalDate curDate = LocalDate.now();
LocalTime curTime = LocalTime.now();
//직접 다 입력해주거나, LocalDate, LocalTime을 합치는 것도 가능하다.
LocalDateTime targetDateTime = LocalDateTime.of(curDate, curTime);
//이런식으로 포맷에 맞춰 가져오는 것도 가능하다.
System.out.println(targetDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
이외에 도움이 될것같은 메소드를 찾으면 추가하도록 하겠다.