Date와 Time

KIMA·2024년 2월 28일
0

java

목록 보기
10/10

java 8 이전 Date 클래스의 문제점 (with Calendar, SimpleDateFormat )

  • 클래스명과는 달리 시간도 표현할 수 있다.
    • 심지어 시간이 인류용(년,월,일,시,분,초)이 아닌 기계용 시간(EPOCH (1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프)으로 표현되어있다.
  • month가 0부터 시작하기 때문에 버그가 발생할 여지가 많다.
  • 데이터가 변경 가능하기 때문에 즉, mutable하기 때문에 멀티스레드 환경에서 안전하지않다.
  • 따라서, 날짜 시간 처리가 복잡한 앱에서는 보통 Joda Time을 사용했다.
    • 이는 다음에 등장하는 새로운 방식의 기반이 된다.

java 8부터 새로운 Date/Time의 등장

  • 디자인 철학
    • Clear
    • Fluent
      • 함수를 계속 이어서 호출할 수 있다.
    • Immutable
    • Extensible
      • 여러 캘린더 타입을 지원한다.
  • java.time 패키지 내부에 존재한다.
  • 기계용 시간과 인류용 시간으로 나눌 수 있다.
    • 기계용 시간은 EPOCK(1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.
      • 타임스태프는 Instant를 사용한다.
    • 인류용 시간은 우리가 흔히 사용하는 년,월,일,시,분,초 등을 표현한다.
      • LocalDate, LocalTime, LocalDateTime를 사용한다.
    • 서로 변환이 가능하다.
  • 기간을 표현할 때는 Duration(기계용 시간 기반)과 Period(인류용 날짜 기반)을 사용할 수 있다.
  • 특정한 문자열로 포맷팅할 때는 DateTimeFormatter를 사용한다.
  • java 8이전의 Date 관련 클래스들과 서로 변환이 가능하다.

Instant

EPOCK(1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.

  • 타임존
    • 기본 값 : UTC(Universal Time Coordinated), GMT(Greenwich Mean Time)
    • 변경 방법 : ZonedDateTime atZone(ZoneId)
  • 사용 목적
    • 메소드 실행 시간을 계산할 때

LocalDateTime

인류용 시간(우리가 흔히 사용하는 년,월,일,시,분,초 등)을 표현한다.

  • 기준 타임존 : 로컬 타임존
    • 타임존 변경
      • ZonedDateTime.now(ZoneId.of("Asia/Seoul")
  • 현재 시간 : now()
  • 생성 방법
    • of(1999, Month.JULY, 8, 0, 0, 0);

Period

인류용 시간에서 날짜를 기반으로 기간을 계산한다.

  • 생성
    • Period.between(LocalDate before, LocalDate after)
    • localDate.until(LocalDate after)

Duration

기계용 시간을 기반으로 기간을 계산한다.

  • 생성
    • Duration.between(Instant before, Instant after)

DateTimeFormat

LocalDateTime과 문자열간의 변환을 지원한다.

  • 포맷 정의 : ofPattern(String)
    • 사전에 정의된 포맷을 사용할 수 있다.
  • 포맷에 맞게 LocalDateTime 출력 : localDateTime.format(DateTimeFormatter)
  • 문자열을 LocalDateTime로 변환 : LocalDate.parse(String, DateTimeFormatter)

타임존

TimeZone before Java 8 → ZoneId since Java 8

  • 현재 로컬 타임존 확인 : ZoneId.SystemDefault()
  • 생성 : ZoneId.of("Asia/Seoul")

Reference
인프런 - '더 자바, Java 8', 백기선

profile
안녕하세요.

0개의 댓글