Java

날짜와 시간 - DateTimeFormatter

hwanguu 2023. 9. 11. 17:21

날짜와 시간을 원하는 형식으로 출력하는 방법에 대해서 확인해보자.

형식화 관련된 클래스들은 java.time.format패키지에 들어있는데, 이중에서 DateTimeFormatter가 핵심이다. 이 클래스에는 자주 쓰이는 다양한 형식들을 기본적으로 정의하고 있으며, 그 외의 형식이 필요하다면 직접 정의해서 사용할 수도 있다.

 

LocalDate localDate = LocalDate.now();
String formatLocalDate = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
String formatLocalDate2 = DateTimeFormatter.ISO_LOCAL_DATE.format(localDate);

System.out.println("formatLocalDate = " + formatLocalDate);
System.out.println("formatLocalDate2 = " + formatLocalDate2);

결과

formatLocalDate = 2023-09-11
formatLocalDate2 = 2023-09-11

날짜와 시간의 형식화에는 위와같이 format()이 사용되는데, 이 메서드는 DateTimeFormatter뿐만 아니라 LocalDate, LocalTime, LocalDateTime같은 클래스에도 있다. 모두 같은 기능을 하기때문에 상황에 따라 편한 쪽을 사용하면 된다.

 

 

아래의 표는 DateTimeFormatter에 상수로 정의된 형식들의 목록이다.

DateTimeFormatter 설명 보기
ISO_DATE_TIME Date and time with Zoneld 2023-09-11T10:15:30+09:00[Asia/Seoul]
ISO_LOCAL_DATE ISO Local Date 2023-09-11
ISO_LOCAL_TIME time without offset 10:15:30
ISO_LOCAL_DATE_TIME ISO Local Date and Time 2023-09-11T10:15:30
ISO_OFFSET_DATE ISO Date with Offset 2023-09-11+09:00
ISO_OFFSET_TIME Time with offset 10:15:30+09:00
ISO_OFFSET_DATE_TIME Date Time with Offset 2023-09-11T10:15:30+09:00
ISO_ZONED_DATE_TIME Zoned Date Time 2023-09-11T10:15:30+09:00[Asia/Seoul]
ISO_INSTANT Date and Time of an Instant 2023-09-11T10:15:30Z
BASIC_ISO_DATE Basic ISO date 20230911
ISO_DATE ISO Date with or without offset 2023-09-11+09:00
2023-09-11
ISO_TIME Time with of without offset 10:15:30+09:00
10:15:30
ISO_ORDINAL_DATE Year and day of year 2023-337
ISO_WEEK_DATE Year and Week 2012-W48-6
RFC_1123_DATE_TIME RFC 1123 / RFC 822 Tue, 3 Jun 2023 10:15:30 GMT

 

코드로 실행해보자

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
LocalDate localDate = LocalDate.now();
print("ISO_DATE_TIME" , DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));
print("ISO_LOCAL_DATE" , DateTimeFormatter.ISO_LOCAL_DATE.format(localDateTime));
print("ISO_LOCAL_TIME" , DateTimeFormatter.ISO_LOCAL_TIME.format(localDateTime));
print("ISO_LOCAL_DATE_TIME" , DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));
print("ISO_OFFSET_DATE" , DateTimeFormatter.ISO_OFFSET_DATE.format(zonedDateTime));
print("ISO_OFFSET_TIME" , DateTimeFormatter.ISO_OFFSET_TIME.format(zonedDateTime));
print("ISO_OFFSET_DATE_TIME" , DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zonedDateTime));
print("ISO_ZONED_DATE_TIME" , DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime));
print("ISO_INSTANT" , DateTimeFormatter.ISO_INSTANT.format(zonedDateTime));
print("BASIC_ISO_DATE" , DateTimeFormatter.BASIC_ISO_DATE.format(localDateTime));
print("ISO_DATE" , DateTimeFormatter.ISO_DATE.format(localDateTime));
print("ISO_TIME" , DateTimeFormatter.ISO_TIME.format(localDateTime));
print("ISO_ORDINAL_DATE" , DateTimeFormatter.ISO_ORDINAL_DATE.format(localDateTime));
print("ISO_WEEK_DATE" , DateTimeFormatter.ISO_WEEK_DATE.format(localDateTime));
print("RFC_1123_DATE_TIME" , DateTimeFormatter.RFC_1123_DATE_TIME.format(zonedDateTime));

결과

ISO_DATE_TIME : 2023-09-11T16:52:59.1326633
ISO_LOCAL_DATE : 2023-09-11
ISO_LOCAL_TIME : 16:52:59.1326633
ISO_LOCAL_DATE_TIME : 2023-09-11T16:52:59.1326633
ISO_OFFSET_DATE : 2023-09-11+09:00
ISO_OFFSET_TIME : 16:52:59.1336614+09:00
ISO_OFFSET_DATE_TIME : 2023-09-11T16:52:59.1336614+09:00
ISO_ZONED_DATE_TIME : 2023-09-11T16:52:59.1336614+09:00[Asia/Seoul]
ISO_INSTANT : 2023-09-11T07:52:59.133661400Z
BASIC_ISO_DATE : 20230911
ISO_DATE : 2023-09-11
ISO_TIME : 16:52:59.1326633
ISO_ORDINAL_DATE : 2023-254
ISO_WEEK_DATE : 2023-W37-1
RFC_1123_DATE_TIME : Mon, 11 Sep 2023 16:52:59 +0900

 

 

로케일에 종속된 형식화

DateTimeFormatter의 static메서드 ofLocalizedDate(), ofLocalizedTime(), ofLocalizedDateTime()은 로케일(locale)에 종속적인 포맷터를 생성한다.

 

DateTimeFormatter shortFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
String shortFormatLocalDateTime = shortFormatter.format(ZonedDateTime.now());
print("FormatStyle.SHORT", shortFormatLocalDateTime);

DateTimeFormatter longFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
String longFormatLocalDateTime = longFormatter.format(ZonedDateTime.now());
print("FormatStyle.LONG", longFormatLocalDateTime);

DateTimeFormatter mediumFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
String mediumFormatLocalDateTime = mediumFormatter.format(ZonedDateTime.now());
print("FormatStyle.MEDIUM", mediumFormatLocalDateTime);

DateTimeFormatter fullFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
String fullFormatLocalDateTime = fullFormatter.format(ZonedDateTime.now());
print("FormatStyle.FULL", fullFormatLocalDateTime);

결과

 

FormatStyle.SHORT : 23. 9. 11.
FormatStyle.LONG : 2023년 9월 11일
FormatStyle.MEDIUM : 2023. 9. 11.
FormatStyle.FULL : 2023년 9월 11일 월요일

 

FormatStyle에 정의된 상수와 출력 예

FormatSytle 날짜 시간
FULL 2017년 6월 12일 월요일 N/A
LONG 2017년 6월 12일 (월) 오후 3시 20분 30초
MEDIUM 2017. 6. 12 오후 3:20:30
SHORT 12. 6. 12 오후 3:20

 

 

출력형식 직접 정의하기

DateTimeFormatter의 ofPattern()으로 원하는 출력형식을 직접 작성할 수도 있다.

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = LocalDateTime.now().format(dateTimeFormatter);
System.out.println("format = " + format);

결과

format = 2023-09-11 17:13:47

 

위 코드와 같이 yyyy-MM-dd HH:mm:ss 형태로 출력할 수 도있다.

 

 

아래의 표는 출력형식에 사용되는 기호목록이다.

기호 의미 출력 예
G 연대 (BC, AD) 서기 또는 AD
y/Y 년도 2023
M/L 월 (1~12 또는 1월~12월) 9
Q/q 분기(quarter) 3
w 년의 몇 번째 주 (1~53) 48
W 월의 몇 번째 주 (1~5) 4
D 년의 몇 번째 일 (1~366) 332
d 월의 몇 번째 일 (1~31) 28
F 월의 몇 번째 요일 (1~5) 4
E/e 요일 토 또는 7
a 오전/오후 (AM/PM) 오후
H 시간 (0~23) 22
h 시간 (1~12) 22
k 시간 (1~24) 10
K 시간 (0~11) 10
m 분 (0~59) 12
s 초 (0~59) 35
S 1/1000초 (0~999) 7
A 1/1000초 (그 날의 0시 0분 0초 부터의 시간) 80263808
n 나노초 (0~999999999) 75000000
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 문자 (특수문자를 표현하는 데 사용) 없음

 

 

한번 사용해보자

ZonedDateTime zdateTime = ZonedDateTime.now();

String[] patternArr = {
        "yyyy-MM-dd HH:mm:ss",
        "''yy년 MMM dd일 E요일",
        "yyyy-MM-dd HH:mm:ss.SSS Z VV",
        "yyyy-MM-dd hh:mm:ss a",
        "오늘은 올 해의 D번째 날입니다.",
        "오늘은 이 달의 d번째 날입니다.",
        "오늘은 올 해의 w번째 주입니다.",
        "오늘은 이 달의 W번째 주입니다.",
        "오늘은 이 달의 W번째 E요일입니다."
};


for(String p : patternArr) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(p);
    System.out.println(zdateTime.format(formatter));
}

결과

2023-09-11 17:19:24
'23년 9월 11일 월요일
2023-09-11 17:19:24.084 +0900 Asia/Seoul
2023-09-11 05:19:24 오후
오늘은 올 해의 254번째 날입니다.
오늘은 이 달의 11번째 날입니다.
오늘은 올 해의 37번째 주입니다.
오늘은 이 달의 3번째 주입니다.
오늘은 이 달의 3번째 월요일입니다.

 

 

 

References

Java의 정석, 남궁 성 지음

'Java' 카테고리의 다른 글

람다식  (0) 2023.09.12
날짜와 시간 - parse  (0) 2023.09.11
날짜 계산 - TemporalAdjusters  (0) 2023.09.11
날짜와 시간 - LocalDateTime, ZonedDateTIme  (0) 2023.09.11
제네릭스  (0) 2023.09.06