JDK의 기본 날짜 클래스는 여러가지 문제점이 있습니다. 그중에서도 가장 큰 문제점은 불변 객체가 아니라는 점입니다. 이 때문에 Calendar 객체나 Date 객체가 여러 곳에서 공유된다면 한 곳에서 바꾼 값이 다른 곳에 영향을 미치는 부작용이 생길 수 있습니다. 이외에도 여러 가지 문제점을 알고싶다면 Java의 날짜와 시간 API 링크를 확인해주시면 됩니다.
일반적인 기본 날짜 클래스는 위와 같은 문제점이 있기에 Joda-Time 이라는 라이브러리를 많이 사용하는 것 같습니다. 이 글에서는 기본적인 Joda-Time 라이브러리 사용법을 알아보겠습니다.
// 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
// 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
참조
- Java의 날짜와 시간 API
- Joda-time
틀린 부분은 댓글로 남겨주시면 수정하겠습니다.