우리가 평소에 시간을 이야기 할 때에는 5시 20분과 같이 시와 분을 붙여서 이야기 합니다.
하지만 컴퓨터에서 시간을 다루려면 Date형이나 Calendar형을 사용합니다.
(사실, 이 클래스들은 불편한 날짜 계산 문제, 일관성 없는 상수, 등 문제가 많은 클래스입니다만...
학습을 위해 여기서는 따로 설명하지 않겠습니다.
실무에서는 LocaleDate, LocaleTime, LocaleDateTime 과 같은 클래스를 사용합니다.)
만약 현재 날짜를 출력한다면
Date date = new Date();
System.out.println(date);
다음과 같이 출력이 됩니다.
Sun May 22 21:30:24 KST 2022
어? 이 형식은 우리가 평소에 접하는 형식과 좀 차이가 있습니다.
한국에서는 보통 2022년 5월 22일 일요일 21시 30분 24초 와 같은 순서로 사용되는데,
Date형을 출력하니 요일, 월, 일, 시간, 년도 순으로 출력됩니다. (KST : 한국 표준시)
만약 우리가 "2시 35분" 과 같은 형식을 Date형으로 입력하거나,
Date형을 "2시 35분"처럼 출력하려면 하고싶다면 어떻게 해야할까요?
이 때 사용하는 클래스가 SimpleDateFormat 클래스 입니다.
https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/text/SimpleDateFormat.html
SimpleDateFormat (Java SE 18 & JDK 18)
All Implemented Interfaces: Serializable, Cloneable SimpleDateFormat is a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows for formatting (date → text), parsing (text → date), and normalization. SimpleDateFormat a
docs.oracle.com
SimpleDateFormat은 지정된 String형 format을 통해
- 날짜 String을 Date형으로 변환해주거나,
- Date형을 format을 적용한 String형으로 변환할 때 사용합니다.
1) SimpleDateFormat 생성하기
public SimpleDateFormat(String pattern)
여러 생성자가 있지만, 공통적으로 패턴(포맷)을 인자로 사용합니다.
패턴의 형식은 다음과 같습니다.
Letter | Date or Time Componenet | Presetation | Example |
G | AD, BC 표시 | Text | AD |
y | 년, 4자리 | Year | 1996 (1996년) |
yy | 년, 뒤에 2자리만 | Year | 96 (1996년) |
M | 월, 1자리 숫자 | Month | 7 (7월) |
MM | 월, 2자리 숫자 | Month | 07 (7월) |
MMM | 월, 3자리 문자 | Month | Jul / 7월 (7월) |
MMMM | 월, 완전한 문자 | Month | July / 7월 (7월) |
w | 해당 년도 주차 (ex 52주차) | Number | 22 (2022년 5월 23일) |
W | 해당 달의 주차 (ex 4월 2주차) | Number | 2 (2022년 5월 23일) |
D | 해당 년도 경과일 (ex 266일) | Number | 143 (2022년 5월 23일) |
d | 일 | Number | 23 (2022년 5월 23일) |
E~EEE | 요일(약어) | Text | Mon / 월 (2022년 5월 23일) |
EEEE | 요일(풀네임) | Text | Monday / 월요일 (2022년 5월 23일) |
u | 요일 상수 변환 (1 = Monday, ..., 7 = Sunday) |
Number | 1 (2022년 5월 23일) |
a | AM(오전)/PM(오후) 표시 | Text | PM / 오후 (12시 00분) |
H | 시간, 0-23시 (23:59 -> 00:00) | Number | 0 (00시 00분) |
k | 시간, 1-24시 (23:59 -> 24:00) | Number | 24 (00시 00분) |
K | 시간, 0-11시 (11:59 -> 00:00) | Number | 0 (12시 00분) |
h | 시간, 1-12시 (11:59 -> 12:00) | Number | 12 (12시 00분) |
m | 분 | Number | 30 (12시 30분 12초) |
s | 초 | Number | 12 (12시 30분 12초) |
S | 밀리초 | Number | 978 (12시 30분 12초 978밀리초) |
기본적으로 패턴의 반복정도는 자릿수를 표시합니다.
예를 들어 포맷이 HH:mm 일 때, 5시 3분은 05:03 으로 표시됩니다.
생성은 다음과 같이 선언합니다.
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일 EEE");
sdfKo 객체는 "2022년 05월 22일 일"과 같은 형식을 지정하였습니다.
기본적으로 시스템이 설정된 locale 형식을 따라가 EEE 경우 "일"이라고 표시됩니다.
만약 다른 국가의 형식을 지정하고 싶다면 Locale 객체를 생성하여 다음과 같이 선언합니다.
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일 EEE");
SimpleDateFormat sdfEn = new SimpleDateFormat("yyyy년 MM월 dd일 EEE",Locale.ENGLISH);
SimpleDateFormat sdfJp = new SimpleDateFormat("yyyy년 MM월 dd일 EEE",Locale.JAPAN);
sdfEn 객체는 English로 설정하여 "2022년 05월 22일 Sun"과 같은 형식을 지정하였습니다.
sdfJp 객체는 Japan으로 설정하여 "2022년 05월 22일 日"과 같은 형식을 지정하였습니다.
2) SimpleDateFormat를 이용하여 String -> Date 변환
SimpleDateFormat의 parse() 메서드를 이용하여 String형을 Date형으로 변환 할 수 있습니다.
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일");
Date dateKo = sdfKo.parse("1972년 11월 21일");
System.out.println(dateKo);
다음과 같이 출력됩니다.
Tue Nov 21 00:00:00 KST 1972
3) SimpleDateFormat를 이용하여 Date -> String 변환
Date형을 원하는 형식으로 변환하려면 SimpleDateFormat의 format() 메서드를 이용합니다.
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일");
SimpleDateFormat sdfJp = new SimpleDateFormat("yyyy년 MM월 dd일 EEE",Locale.JAPAN);
Date dateKo = sdfKo.parse("1972년 11월 21일");
System.out.println(dateKo);
System.out.println(sdfJp.format(dateKo));
다음과 같이 출력됩니다.
Tue Nov 21 00:00:00 KST 1972
1972년 11월 21일 火
+) SimpleDateFormat의 양식에 맞는지 확인하는 방법
SimpleDateFormat은 DateFormat을 상속받고 있습니다.
...
public class SimpleDateFormat extends DateFormat {
...
DateFormat 클래스는 setLenient()라는 메서드를 가지고 있습니다.
public void setLenient(boolean lenient)
lenient란 허술한, 관대한 이라는 뜻으로 기본값으로 true로 설정되어있습니다.
다음 예제를 실행한다면...
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일");
Date dateKo = sdfKo.parse("1972년 11월 31일");
System.out.println(sdfKo.format(dateKo));
11월은 30일까지만 있지만 실행 결과는
1972년 12월 01일
이라고 출력됩니다.
11월 30일 +1 일로 자동으로 계산하여 이를 출력하게 됩니다.
하지만 setLenient(false)를 설정하면 정확한 날짜 형식이어야만 parse됩니다.
SimpleDateFormat sdfKo = new SimpleDateFormat("yyyy년 MM월 dd일");
sdfKo.setLenient(false);
Date dateKo = sdfKo.parse("1972년 11월 31일");
System.out.println(sdfKo.format(dateKo));
출력된 결과는 에러를 보여줍니다.
Exception in thread "main" java.text.ParseException: Unparseable date: "1972년 11월 31일"
at java.base/java.text.DateFormat.parse(DateFormat.java:396)
'Java' 카테고리의 다른 글
Optional 클래스 (0) | 2022.04.16 |
---|
댓글