java.text.SimpleDateFormat 클래스는 문자열을 날짜로, 날짜를 다시 문자열로 변환(포맷 및 파싱)할 때 사용하는 대표적인 Java 클래스입니다.
날짜 문자열 파싱하기
SimpleDateFormat 클래스의 생성자 중 하나는 원하는 날짜 형식을 나타내는 String 값을 인자로 받아 SimpleDateFormat 객체를 생성합니다. 문자열을 Date 객체로 파싱(변환)하려면 다음 단계를 따르면 됩니다.
- 원하는 형식 문자열을 전달하여 SimpleDateFormat 객체를 생성합니다.
- parse() 메서드를 사용하여 날짜 문자열을 파싱합니다.
아래 표는 날짜 포맷에 사용되는 패턴 문자(letter)와 각각의 의미, 그리고 예시를 정리한 것입니다.
| 문자 | 구성 요소 | 예시 |
|---|---|---|
| G | 연대(Era) 표기 | AD, BC |
| y | 연도(Year) | 2005, 96 |
| Y | 주 기준 연도(Week year) | 2005, 96 |
| M | 월(Month in year) | September, Sep, 09 |
| L | 월(Month in year) | September, Sep, 09 |
| w | 연중 몇 번째 주(Week in year) | 23 |
| W | 월중 몇 번째 주(Week in month) | 3 |
| D | 연중 몇 번째 일(Day in year) | 129 |
| d | 월중 몇 번째 일(Day in month) | 27 |
| F | 월중 몇 번째 요일(Day of week in month) | 5 |
| E | 요일 이름(Day in a week) | Monday, Mon |
| u | 요일 번호(Day in a week) | 1 |
| a | 오전/오후(AM/PM) | Pm, AM |
| H | 시간(0-23) | 0, 22 |
| k | 시간(1-24) | 1, 12, 24 |
| K | 오전/오후 시간(0-11) | 0, 5, 11 |
| h | 오전/오후 시간(1-12) | 1, 5, 12 |
| m | 분(Minute in hour) | 25 |
| s | 초(Second in minute) | 24 |
| S | 밀리초(Millisecond) | 756 |
| z | 타임존(Time zone) | PST, GMT |
| Z | 타임존(RFC 822) | -0500 |
| X | 타임존(ISO 8601) | -06, -0600, -06:00 |
사용 예제 1: 다양한 패턴으로 날짜 파싱
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/dd/MM");
Date date = formatter.parse("2007/25/06");
System.out.println("Date value: " + date);
formatter = new SimpleDateFormat("y:G");
date = formatter.parse("1920:BC");
System.out.println("Date value: " + date);
formatter = new SimpleDateFormat("D-M-Y");
date = formatter.parse("25-05-1989");
System.out.println("Date value: " + date);
}
}출력 결과
Date value: Mon Jun 25 00:00:00 IST 2007 Date value: Sun Jan 01 00:00:00 IST 1920 Date value: Sun Jan 01 00:00:00 IST 1989
사용 예제 2: 시간 및 요일 패턴 활용
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
SimpleDateFormat formatter1 = new SimpleDateFormat("HH:mm:ss");
Date time1 = formatter1.parse("07:25:30");
System.out.println("Date value: " + time1);
SimpleDateFormat formatter2 = new SimpleDateFormat("EEE:MMM-d:YYYY");
Date time2 = formatter2.parse("Sun:Jan-8:2018");
System.out.println("Date value: " + time2);
SimpleDateFormat formatter3 = new SimpleDateFormat("hh 'o''clock' a");
Date time3 = formatter3.parse("09 o'clock AM");
System.out.println("Date value: " + time3);
}
}출력 결과
Date value: Thu Jan 01 07:25:30 IST 1970 Date value: Sun Dec 31 00:00:00 IST 2017 Date value: Thu Jan 01 09:00:00 IST 1970
참고 사항
SimpleDateFormat은 스레드에 안전하지 않으므로(thread-safe하지 않음), 여러 스레드가 동시에 접근하는 환경에서는 주의해야 합니다. Java 8 이상에서는 java.time.format.DateTimeFormatter 사용을 권장합니다. 또한 패턴 문자의 개수에 따라 출력 형태가 달라집니다. 예를 들어 'M'이 두 개(MM)면 숫자 월을, 네 개(MMMM)면 전체 월 이름을 표시하므로, 원하는 출력 형식에 맞게 패턴 문자 수를 조절하는 것이 중요합니다.