[기본 개념] 5 | (3.3) Period, Duration, 파싱, 포맷
1 java.time패키지의 핵심 클래스
2 LocalDate와 LocalTime
3 Instant
4 LocalDateTime과 ZonedDateTime
5 TemporalAdjusters
6 Period와 Duration
7 파싱과 포맷
6. Period와 Duration
날짜 - 날짜 = Period
시간 - 시간 = Duration
between( )
두 날짜의 차이를 나타낼 수 있다.
LocalDate date1 = LocalDate.of(2014, 1, 1) ;
LocalDate date2 = LocalDate.of(2015, 12, 31) ;
Period pe = Period.between(date1, date2) ;
date1이 date2보다 날짜상 이전이면 양수로, 이후면 음수로 저장된다. 그리고 시간 차이를 구할 때는 Duration을 이용하면 된다.
Period와 Duration에서 특정 필드 값을 얻을 때 get( )을 사용한다.
long year = pe.get(ChronoUnit.YEARS) ; // int getYears( )
그런데 Duration에는 getHours( ), getMinites( )같은 메서드가 없다. 그렇다면 Duration을 LocalTime으로 변환한 다음, LocalTime이 가지고 있는 get메서드를 이용하면 사용할 수 있다.
LocalTime tmpTime = LocalTime.of(0, 0).plusSeconds(du.getSeconds( )) ;
int hour = tmpTime.getHour( ) ;
between( )과 until( )
until( )은 between( )과 같은 일을 하는데, between( )은 static메서드고, until( )은 인스턴스메서드라는 차이가 있다.
Period는 년월일을 분리해서 저장하기 때문에, D-day를 구하려면 두 개의 매개변수를 받는 until( )을 사용하는 것이 낫다. 날짜가 아닌 시간에도 until( )을 사용할 수 있지만, Duration을 반환하는 until( )은 없다.
of( ), with( )
Period : of( ), ofYears( ), ofMonths( ), ofWeeks( ), ofDays( ) 등
Duration : of( ), ofDays( ), ofHours( ), ofMinutes( ), ofSeconds( ) 등
특정 필드의 값을 변경하는 with( )도 있다.
사칙연산, 비교연산, 기타 메서드
곱셈과 나눗셈을 위한 메서드도 있다.
pe = pe.minusYears(1).multipliedBy(2) ; // 1년을 빼고, 2배를 곱한다.
또한 음수인지 확인하는 isNegative( )와 0인지 확인하는 isZero( )가 있다. 그리고 부호를 반대로 변경하는 negative( )와 부호를 없애는 abs( )가 있다. 하지만 abs( )는 Period에 없다.
다른 단위로 변환 - toTotalMonths( ), toDays( ), toHours( ), toMinutes( )
Period와 Duration을 다른 단위의 값으로 변환하는 'to'로 시작하는 메서드들이 있는데, 아래의 메서드들은 특정 단위로 변환한 결과를 반환한다는 것에서 get( )과 차이가 있다.
클래스 | 메서드 | 설명 |
Period | long toTotalMonths( ) | 년월일을 월단위로 변환해서 반환(일 단위는 무시) |
Duration | long toDays( ) | 일단위로 변환해서 반환 |
long toHours( ) | 시간단위로 변환해서 반환 | |
long toMinutes( ) | 분단위로 변환해서 반환 | |
long toMillis( ) | 천분의 일초 단위로 변환해서 반환 | |
long toNanos( ) | 나노초 단위로 변환해서 반환 |
7. 파싱과 포맷
날짜와 시간을 원하는 형식으로 출력하고 해석(파싱, parsing)하는 방법에 대해 알아보자.
형식화와 관련된 클래스 중에서 DataTimFormattiner는 자주 쓰이는 다양한 형식들을 기본적으로 정의하고 있으며, 직접 정의해서 사용할 수도 있다.
LocalDate date = LocalDate.of(2016, 1, 2) ;
String yyyymmdd = DateTimeFormatter.ISO_LOCAL_DATE.format(date) ;
String yyyymmdd = date.format(DateTimeFormatter.ISO_LOCAL_DATE) ;
로케일에 종속된 형식화
DateTimeFormatter의 static메서드 ofLocalizedDate( ), ofLocalizedTime( ), ofLocalized DateTime( )은 로케일(locale)에 종속적인 포맷터를 생성한다.
FormatStyle의 종류에 따른 출력 형태는 다음과 같다.
FormatSytle | 날짜 | 시간 |
FULL | 2015년 11월 28일 토요일 | N/A |
LONG | 2015년 11우러 28일 (토) | 오후 9시 15분 13초 |
MEDIUM | 2015.11.28 | 오후 9:15:13 |
SHORT | 15.11.18 | 오후 9:15 |
출력형식 직접 정의하기
DateTimeFormatter의 ofPattern( )으로 원하는 출력 형식을 직접 작성할 수 있다.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd") ;
출력 형식에 사용되는 기호 목록이다.
기호 | 의미 | 보기 |
G | 연대 (BC, AD) | AD |
y 또는 u | 년도 | 2015 |
M 또는 L | 월(1 ~ 12) | 11 |
Q 또는 q | 분기(quarter) | 4 |
w | 년의 몇 번째 주(1 ~ 53) | 48 |
W | 월의 몇 번째 주(1 ~ 5) | 4 |
D | 년의 몇 번째 일(1 ~ 366 | 332 |
d | 월의 몇 번째 일(1 ~ 31) | 28 |
F | 월의 몇 번째 요일(1 ~ %) | 4 |
E 또는 e | 요일 | 토 또는 7 |
a | 오전 / 오후 (AM, PM) | 오후 |
H | 시간(0 ~ 23) | 22 |
k | 시간(! ~ 24) | 22 |
K | 시간(0 ~ 11) | 10 |
h | 시간(1 ~ 12 | 10 |
m | 분(0 ~ 59) | 12 |
s | 초(0 ~ 59) | 35 |
S | 천분의 일초(0 ~ 999) | 7 |
A | 천분의 일초(그 날의 0시 0분 0초부터의 시간) | 80263808 |
n | 나노초(0 ~ 999999999) | 475000000 |
N | 나노초(그 날의 0시 0분 0초부터의 시간) | 81069992000000 |
V | 시간대 ID (VV) | Asia/Seoul |
z | 시간대(time-zone) 이름 | KST |
O | 지역화된 zone-offset | GMT+9 |
Z | zone-offset | +0900 |
X 또는 x | zone-offset(Z는 +00:00를 의미) | +09 |
' | escape문자(특수문자를 포현하는데 사용) | 없음 |
문자열을 날짜와 시간으로 파싱하기
문자열을 날짜와 시간으로 변환하려면 static메서드 parse( )를 사용하면 된다.
static LocalDateTime parse(CharSequence text)
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
DateTimeFormatter에 상수로 정의된 형식을 사용할 때는 다음과 같이한다.
LocalDate date = LocalDate.parse("2016-01-02", DateTimeFormatter.ISO_LOCAL_DATE) ;
자주 사용되는 기본적인 형식의 문자열은 형식화 상수를 사용하지 않고도 가능하다.
LocalDate newDate = LocalDate.parse("2001-01-01") ;
LocalTime newTime = LocalTime.parse("23:59:29") ;
LocalDateTime newDateTime = LocalDateTime.parse("2001-01-01T23:59:59") ;
ofPattern( )을 이용해서 파싱을 할 수도 있다.
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ;
LocalDateTime endOfYear = LocalDateTime.parse("2015-12-31 23:59:59", pattern) ;
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 6 | (1.2) ArrayList (0) | 2021.12.02 |
---|---|
[기본 개념] 6 | (1.1) 컬렉션 프레임웍의 인터페이스 (0) | 2021.12.02 |
[기본 개념] 5 | (3.2) Instant, LocalDateTime, ZonedDateTime, TemporalAdjusters (0) | 2021.12.01 |
[기본 개념] 5 | (3.1) java.time 패키지, LocalDate, LocalTime (0) | 2021.12.01 |
[기본 개념] 5 | (2.1) 형식화 클래스 (0) | 2021.12.01 |