본문 바로가기

Language/JAVA

[JAVA] 날짜 관련 클래스 Calendar와 LocalDateTime, ChronoField 사용방법

 

날짜 관련 클래스 - 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/

 

[Java8 Time API] ZonedDateTime 사용법

Engineering Blog by Dale Seo

www.daleseo.com

 

 

💡 객체의 생성 - 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 패키지를 구성하는 클래스의 메소드에서는 이 열거체를 이용하여 날짜와 시간을 처리하고 있다.

 

출처 : TCP School

 

 

❓왜 사용❓

메소드를 통일하고 뒷자리의 필드로 구분하기 위해 사용한다. -> 메서드화 시킬 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)이런 식으로 받아 화면에 오전/오후 보여줄 수 있다!