날짜 관련 클래스 - Calendar, LocalTime, LocalDate, LocalDateTime
Calendar 클래스
날짜와 시간을 다루는 Calendar 클래스
추상 클래스이기 때문에 객체 생성이 불가하고, Calendar.getInstance() 메소드를 이용해야 한다.
Calendar time = Calendar.getInstance();
System.out.println(time.getTime());
특이한 점은 Calendar객체.get() 함수를 통해 년/월/일 정보를 가져올 수 있는데
월 정보는 1월이 숫자 0으로 매핑되어 있어, 출력 값에 +1을 더해줘야 월 정보가 제대로 출력된다.
( 뒤에 나올 ChoronoField와 큰 차이점 ! )
// 특정한 숫자 값은 get함수의 input 값으로 주어, 원하는 날짜 정보를 출력할 수 있게 해준다.
System.out.println(time.get(1)); //년도 정보
System.out.println(time.get(2)+1); //월 정보 - 1월이 0부터 시작해서 +1해줘야 한다.
Calendar 클래스의 다양한 상수를 통해 특정 값을 가져올 수 있다.
년도, 월, 일 정보부터 시간, 분, 초까지 다양하다.
System.out.println(time.get(Calendar.YEAR)); //년
System.out.println(time.get(Calendar.MONTH)+1); //월
System.out.println(time.get(Calendar.DAY_OF_MONTH)); //일
System.out.println(time.get(Calendar.DAY_OF_WEEK)); //요일(일:1, 월:2, 화:3 ~~ 금:6 토:7)
System.out.println(time.get(Calendar.HOUR_OF_DAY));
System.out.println(time.get(Calendar.MINUTE));
System.out.println(time.get(Calendar.SECOND));
하지만 Calendar 클래스는 많은 문제점을 갖고 있기 때문에,
java8에서 등장한 LocalTime, LocalDate, LocalDateTime을 주로 사용한다.
Local 식구들 - LocalTime, LocalDate, LocalDateTime
1. LocalTime
날짜가 없는 시간 ( 타임존에 대한 참조가 없음 = 시차를 고려하지 않음 )
💡 객체의 생성
LocalTime present_time = LocalTime.now();
System.out.println(present_time);
System.out.println(present_time.getHour());
System.out.println(present_time.getMinute());
System.out.println(present_time.getSecond());
타임존이 뭐야??????
쉽게 말해, 각 나라/도시마다 다른 시차를 의미한다. 자세한 건 아래 블로그를 참고하길
https://www.daleseo.com/java8-zoned-date-time/
💡 객체의 생성 - of 메서드
// 임의로 특정 시간을 만들어 내고 싶을 때 : of 메서드 사용
LocalTime birthTime = LocalTime.of(02,02,19);
LocalTime birthTime2 = LocalTime.of(02,02,19,11);
System.out.println(birthTime);
System.out.println(birthTime2);
2. LocalDate
시간이 없는 날짜 ( 타임존에 대한 참조가 없음 = 시차를 고려하지 않음 )
💡 객체의 생성
LocalDate present_date = LocalDate.now();
System.out.println(present_date);
💡 객체의 생성 - of 메서드
// 임의로 특정 시간을 만들어 내고 싶을 때 : of 메서드 사용
LocalDate birthDay = LocalDate.of(2023, 12, 26);
// 일반 내장 메서드
System.out.println(birthDay.getYear());
System.out.println(birthDay.getMonth());
System.out.println(birthDay.getDayOfMonth());
3. LocalDateTime
날짜와 시간을 결합한 클래스
💡 객체의 생성
LocalDateTime this_time = LocalDateTime.now();
System.out.println(this_time);
💡 객체의 생성 - of 메서드
// 임의로 특정 시간을 만들어 내고 싶을 때 : of 메서드 사용
LocalDate birthDay = LocalDate.of(2023, 12, 27);
LocalTime birthTime = LocalTime.of(02,02,19);
LocalDateTime birthDayTime = LocalDateTime.of(birthDay, birthTime);
System.out.println(birthDayTime);
ChronoField 열거체
TemporalField 인터페이스는 월(month-of-year)과 시(hour-of-day)와 같이 날짜와 시간과 관련된 필드를 정의해 놓은 인터페이스.
TemporalField 인터페이스를 구현하여 날짜와 시간을 나타낼 때 사용하는 열거체가 : ChronoField
java.time 패키지를 구성하는 클래스의 메소드에서는 이 열거체를 이용하여 날짜와 시간을 처리하고 있다.
❓왜 사용❓
메소드를 통일하고 뒷자리의 필드로 구분하기 위해 사용한다. -> 메서드화 시킬 때 ChronoField를 매개변수화 시킬 수 있다.
// 매개변수로 크로노 필드를 받아 프로그램의 유연성 향상
LocalDate birthDay = LocalDate.of(2023, 12, 27);
LocalTime birthTime = LocalTime.of(02,02,19);
LocalDateTime birthDayTime = LocalDateTime.of(birthDay, birthTime);
printCalendar(birthDayTime, ChronoField.YEAR);
printCalendar(birthDayTime, ChronoField.MONTH_OF_YEAR);
printCalendar(birthDayTime, ChronoField.AMPM_OF_DAY);
static void printCalendar(LocalDateTime ldt, ChronoField cf){
if(cf == ChronoField.YEAR){
System.out.println("연도는 " + ldt.get(cf.YEAR) + "입니다");
} else if(cf == ChronoField.MONTH_OF_YEAR){
System.out.println("월은 " + ldt.get(cf.MONTH_OF_YEAR) + "입니다");
}
else if(cf == ChronoField.AMPM_OF_DAY){
String temp = "";
if(ldt.get(ChronoField.AMPM_OF_DAY)==0){
temp = "오전";
}
else {
temp="오후";
}
System.out.println("오전/오후는 " + temp + "입니다");
}
}
(+) 추가적으로,
DB의 DateTime과 Spring의 LocalDateTime이 싱크가 맞기 때문에
나중에 스프링에서 스프링에서 date.get(ChronoField.AMPM_OF_DAY)이런 식으로 받아 화면에 오전/오후 보여줄 수 있다!
'Language > JAVA' 카테고리의 다른 글
[JAVA] 제네릭 쉬운 예제로 이해하기 (0) | 2023.12.31 |
---|---|
[JAVA] 스레드 개념과 사용방법 쉬운 예시로 이해하기 (0) | 2023.12.29 |
[JAVA] Comparator와 Comparable 이해하기 (1) | 2023.12.22 |
[JAVA] 인터페이스 개념과 장점 쉬운 예시로 이해하기 (3) | 2023.12.21 |
자바 클래스와 객체 관계에서 스프링적 사고하기 (1) | 2023.12.17 |