[자바] Joda-time

hee09·2022년 2월 18일
0

개요

JDK의 기본 날짜 클래스는 여러가지 문제점이 있습니다. 그중에서도 가장 큰 문제점은 불변 객체가 아니라는 점입니다. 이 때문에 Calendar 객체나 Date 객체가 여러 곳에서 공유된다면 한 곳에서 바꾼 값이 다른 곳에 영향을 미치는 부작용이 생길 수 있습니다. 이외에도 여러 가지 문제점을 알고싶다면 Java의 날짜와 시간 API 링크를 확인해주시면 됩니다.

일반적인 기본 날짜 클래스는 위와 같은 문제점이 있기에 Joda-Time 이라는 라이브러리를 많이 사용하는 것 같습니다. 이 글에서는 기본적인 Joda-Time 라이브러리 사용법을 알아보겠습니다.


예제 1(Field 등)

// Immutable한 Date + Time 객체
val now = DateTime()
// Pattern(y -> 년, M -> 월, d -> 일, H -> 시, m -> 분, s -> 초)
val datePattern = "yyyy.MM.dd HH:mm:ss"
// Formatter
val fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")

println("현재 날짜 : $now") // 현재 날짜 + 시간
println("YEAR : ${now.year}") // 현재 년도
println("MONTH : ${now.monthOfYear}") // 현재 달
println("DATE : ${now.dayOfMonth}") // 현재 월의 날짜
println("WEEK_OF_YEAR : ${now.weekOfWeekyear}") // 현재 년도의 몇째 주
println("DAY_OF_YEAR : ${now.dayOfYear}") // 현재 년도의 날짜
println("DAY_OF_WEEK : ${now.dayOfWeek}") // 현재 요일(월요일 1 ~ 일요일 7)
println("HOUR : ${now.hourOfDay}") // 현재 시간(24시간제)
println("MINUTE : ${now.minuteOfHour}") // 현재 분
println("SECOND : ${now.secondOfMinute}") // 현재 초
println("Millis : ${now.millis}") // DateTime 객체의 밀리초(milliseconds)
println("Millis to DateTime : ${DateTime(now.millis)}") // 밀리초를 DateTime 객체로 변경
println("Pattern 적용한 모습 : ${now.toString(datePattern)}") // DateTime -> String
println("Pattern 적용한 모습 2 : ${fmt.print(now)}") // DateTime -> String

// 차례대로 년,월,일,시,분,초 더하기
now.plusYears(1)
now.plusMonths(1)
now.plusDays(1)
now.plusHours(1)
now.plusMinutes(1)
now.plusSeconds(1)

// 차례대로 년,월,일,시,분,초 빼기
now.minusYears(1)
now.minusMonths(1)
now.minusDays(1)
now.minusHours(1)
now.minusMinutes(1)
now.minusSeconds(1)
결과

현재 날짜 및 시간 : 2022-02-17T01:04:24.266+09:00
YEAR : 2022
MONTH : 2
DATE : 17
WEEK_OF_YEAR : 7
DAY_OF_YEAR : 48
DAY_OF_WEEK : 4
HOUR : 1
MINUTE : 4
SECOND : 24
Millis : 1645027464266
Millis to DateTime : 2022-02-17T01:04:24.266+09:00
Pattern 적용한 모습 : 2022.02.17 01:04:24
Pattern 적용한 모습 2 : 2022-02-17 01:04:24
  • DateTime은 날짜(Date)와 시간(Time)이 함께 들어간 클래스입니다.
  • DateTime 생성자에 인자를 넣지 않으면 현재 시간을 획득합니다. 만약 인자(년,월,일,시,분,초)를 지정하면 인자로 넣은 날짜와 시간에 해당하는 DateTime 객체를 생성합니다.
  • 여러가지 필드를 사용해 원하는 값에 접근할 수 있고, 필드에 대한 추가 내용은 Date and Time fields에 있습니다.
  • plusDays, plusMinutes, minusDays, minusMinutes 등 단위별 날짜 연산 메서드를 클래스에서 지원합니다. 메서드가 호출된 객체의 상태를 바꾸지 않고 새로운 객체를 반환합니다. 즉, 불변 객체입니다.
  • 패턴에 대한 추가 내용은 Pattern based formatting에 있습니다.

예제 2(상수 등)

// Immutable Date(직접 날짜 지정 - 년, 월, 일)
val date = LocalDate(2021, 12, 25)
val time = LocalTime(11, 30, 20)
// 날짜 변경
val tenYearsLater = date.year().setCopy(2031)

println("DATE : $date") // Date
println("TIME : $time") // Time
println("TEN_YEARS_LATER : $tenYearsLater") // 날짜 변경
// Joda-Time 라이브러리에는 DateTimeConstants 클래스에 여러 상수들이 포함되어 있다.
println("JANUARY : ${DateTimeConstants.JANUARY}") // 1월(1)
println("FEBRUARY : ${DateTimeConstants.FEBRUARY}") // 2월(2)
println("MONDAY : ${DateTimeConstants.MONDAY}") // 월요일(1)
println("SUNDAY : ${DateTimeConstants.SUNDAY}") // 일요일(7)
println("SECOND_PER_MINUTE : ${DateTimeConstants.SECONDS_PER_MINUTE}") // 분당 초(60)
println("MINUTES_PER_HOUR : ${DateTimeConstants.MINUTES_PER_HOUR}") // 시간당 분(60)
println("HOURS_PER_DAY : ${DateTimeConstants.HOURS_PER_DAY}") // 하루당 시간(24)
println("DAYS_PER_WEEK : ${DateTimeConstants.DAYS_PER_WEEK}") // 한주의 일수(7)
결과

DATE : 2021-12-25
TIME : 11:30:20.000
JANUARY : 1
FEBRUARY : 2
MONDAY : 1
SUNDAY : 7
SECOND_PER_MINUTE : 60
MINUTES_PER_HOUR : 60
HOURS_PER_DAY : 24
DAYS_PER_WEEK : 7
  • DateTime 외에 LocalDate(날짜), LocalTime(시간) 클래스가 존재합니다.
  • Joda-time에는 DateTimeConstants 클래스에 여러 가지 상수가 저장되어 있습니다. 위와 같이 달과 요일 등의 정보를 얻어올 수 있고, DateTime 객체의 값들과 비교할 때 사용하면 됩니다.
  • 월의 int 값과 명칭이 일치합니다. 즉, 1월은 int 값 1이고 12월은 int 값 12 입니다.
  • 요일의 int 값은 월요일은 1, 화요일은 2, ... , 토요일은 6, 일요일은 7 입니다.

참조

profile
되새기기 위해 기록

0개의 댓글