날짜와 시간을 원하는 형식으로 출력하는 방법에 대해서 확인해보자.
형식화 관련된 클래스들은 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 |