ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 날짜와 시간
    Java 2024. 2. 26. 00:30
    728x90
    반응형

    Calendar, Date 클래스

    Date는 jdk1.0부터, Calendar는 jdk1.1부터 출시했다.
    그러나 부족한 점이 많아 jdk1.8부터 'java.time패키지'로 기존의 단점을 개선한 새로운 클래스들이 추가되었다.

    하지만 20년 간 두 클래스가 계속 사용되어 왔고, 지금도 계속 사용 중이기 때문에 안배울 수 없다.
    깊이 배울 필요는 없고, 간단한 것들을 이해하고 필요할 때 활용하는 정도면 충분하다

    참고    여기서 말하는 Date클래스는 java.util 패키지에 속한 것이다. java.sql패키지의 Date클래스와 다르다


        

    Calendar, GregorianCalendar

    Calendar는 추상 클래스라 직접 객체 생성이 안된다. 메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

    예시

    Calendar cal = Calendar.getInstance();


    Calendar를 완전히 구현한 클래스는 GregorianCalendar와 BuddhistCalendar가 있는데,
    시스템의 국가와 지역설정을 확인해서 태국인 경우 BuddhistCalendar,
    그 외는 GregorianCalendar의 인스턴스를 반환한다.

    GregorianCalendar는 Calendar를 상속받아 오늘날 전세계 공통으로 사용 중인 그레고리력에 맞게 구현한 것이다.

    인스턴스를 직접 생성하지 않고 메서드를 통해 인스턴스를 반환받는 이유는 최소한의 변경으로 프로그램이 동작할 수 있도록 하기 위함이다

    예시2

    Calendar car = new GregorianCalendar();


    만약 이렇게 인스턴스를 생성하면 다른 종류의 역법(Calendar)을 사용하는 국가에서 실행되거나, 새로운 역법이 추가되던가 하는 경우에,
    객체를 계속 변경해야 하는데, getInstance();를 통해 얻어오면 변경하지 않아도 된다. 물론 getInstance()의 내용은 바뀐다

    getInstance()가 static인 이유는 메서드 내의 코드에서 인스턴스 변수를 사용하거나 인스턴스 메서드를 호출하지 않기 때문이다.
    또, static이 아니라면 객체를 생성한 다음 호출해야 하는데 Calendar는 추상클래스라 객체 생성이 안된다.
        

    Date와 Calendar간의 변환

    Calendar가 추가되면서 Date는 대부분의 메서드가 'deprecated'되어서 잘 사용하지 않는다.
    그럼에도 여전히 Date를 필요로 하는 메서드들이 있기 때문에 Calendar를 Date로, 또는 반대로 변환할 일이 생긴다.

    예시 Calendar > Date

    Calendar cal = Calendar.getInstance();
    Date d = new Date(cal.getTimeInMillis());               // Date(long date)


    예시 Date > Calendar           

    Date d = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);

     

    두 날짜간의 차이

    두 날짜를 최소단위인 초단위로 변경한 다음, 그 차이를 구하면 된다.
    getTimeInMillis()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000으로 나눠야 한다.
    일 단위로 얻을 땐 24(시간)*60(분)*60(초)*1000으로 나누어야 한다.

    시간상의 전후를 알고 싶으면 두 날짜간의 차이가 양인지 음인지 판단하면 된다

     

    날짜의 증감

    add(int field, int amount)를 사용하면 지정한 필드의 값을 원하는만큼 증가, 감소시킬 수 있다.
    roll(int field, int amount)도 똑같은데 add와 차이점은 다른 필드에 영향을 주지 않는다.

    add()로 date를 31 증가시키면 month도 1 증가하지만, roll()은 month의 값이 바뀌지 않는다

    다음 달의 1일에서 하루를 빼면, 이 달의 마지막 날짜를 알 수 있다.

    형식화 클래스

    // 필요하면 더 찾아 공부하자
    DecimalFormat           : 숫자를 형식화 하는데 사용
            
    SimpleDateFormat        : 날짜를 출력하는 방법                                  

    // Date, Calendar를 이용해 계산한 후, 출력하려면 불편해서 사용

    ChoiceFormat            : 특정 범위에 속하는 값을 문자열로 변환                 

    // if문으로도 가능하지만 ChoiceFormat을 통해 직관적으로 만들 수 있음

    MessageFormat           : 데이터를 정해진 양식에 맞게 출력할 수 있게 한다.              

    // python의 포매팅이랑 같은거, 형식은 좀 다름

    java.time 패키지

    날짜와 시간을 하나로 표현하는 Calendar와 달리, 날짜와 시간을 별도의 클래스로 분리해 놓았다.
    시간은 LocalTime클래스, 날짜는 LocalDate클래스, 둘 다 필요하면 LocalDateTime클래스 사용,

    시간대까지 다뤄야 하면, ZonedDateTime클래스

    Date랑 비슷한 Instant도 있음, 날짜와 시간을 나노초단위로 표현
    날짜와 시간을 초단위로 표현한 값을 타임스탬프라고 함
    날짜와 시간을 하나의 정수로 표현할 수 있으므로 날짜와 시간의 차이를 계산하거나, 순서를 비교하는데 유리해서 데이터베이스에 많이 사용함

        

    객체 생성 - now(), of()

    예시

    LocalDate date = LocalDate.now();
    
    LocalDate date = LocalDate.of(2015, 11, 23);


    LocalDate, LocalTime, LocalDateTime, ZonedDateTime 전부 Temporal, TemporalAccessor, TemporalAdjuster 인터페이스를 구현했다.
    매개 변수 타입이 Temporal로 시작하는 것들이 자주 등장하는데, TemporalAmount인지 아닌지만 확인하면 된다
        

    날짜와 시간에서 특정 필드의 값만을 얻을 때는 get()이나, get으로 시작하는 메서드를 이용한다.

    LocalTime now = LocalTime.now();
    int minute = now.getMinute();       // 현재 시간에서 분만 뽑는다


        

    LocalDate, LocalTime

    java.time 패키지의 가장 기본이되는 클래스, 나머지는 두 클래스의 확장이다
    날짜와 시간을 LocalDate, LocalTime으로 각각 반환하는 now(),
    지정된 날짜와 시간으로 LocalDate, LocalTime 객체를 생성하는 of()가 있다. 둘 다 static메서드

    특정 필드의 값을 바꿀 땐, with로 시작하는 메서드, plus(), minus() 사용

    날짜와 시간의 비교 - isAfter(), isBefore(), isEqual()
    compareTo()가 적절히 오버라이딩 되있어서 사용할 수 있지만 더 편한 isAfter(), isBefore(), isEqual()가 있다.
    equals()가 있는데, isEqual()을 제공하는 건 모든 필드가 일치해야 하는 equals와 달리 isEqual는 오직 날짜만 비교한다
        
        

    문자열을 날짜와 시간으로 파싱

    LocalDate newDate = LocalDate.parse("2001-01-01");



    728x90
    반응형
Designed by Tistory.