SimpleDateFormat이란?
java.text.SimpleDateFormat 클래스는 문자열을 날짜(Date) 객체로 변환하거나, 반대로 날짜 객체를 지정한 형식의 문자열로 변환(포맷 및 파싱)할 때 사용되는 대표적인 날짜 처리 클래스입니다.
이 클래스의 생성자 중 하나는 원하는 날짜 형식을 나타내는 String 패턴 값을 인자로 받아 SimpleDateFormat 객체를 생성합니다.
날짜 문자열 파싱하기
문자열을 Date 객체로 변환(파싱)하려면 다음 두 단계만 거치면 됩니다.
- 원하는 형식 패턴 문자열을 생성자에 전달하여 SimpleDateFormat 인스턴스를 생성합니다.
- parse() 메서드를 호출하여 날짜 문자열을 Date 객체로 변환합니다.
예제 코드
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
String date_string = "2007-25-06";
// SimpleDateFormat 클래스 인스턴스 생성
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
// 주어진 문자열을 Date 객체로 파싱
Date date = formatter.parse(date_string);
System.out.println("Date value: " + date);
}
}실행 결과
Date value: Mon Jun 25 00:00:00 IST 2007
패턴 문자열 조회하기
toPattern() 메서드를 사용하면 현재 SimpleDateFormat 객체가 사용 중인 날짜 형식 패턴을 문자열로 확인할 수 있습니다.
예제 코드
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Demo {
public static void main(String args[]) throws ParseException {
SimpleDateFormat obj = new SimpleDateFormat();
String pattern = obj.toPattern();
System.out.println(pattern);
}
}실행 결과
M/d/yy h:mm a
텍스트에서 특정 위치의 날짜 추출하기
parse() 메서드는 날짜 문자열뿐 아니라 ParsePosition 객체를 함께 인자로 받을 수 있습니다. 이를 활용하면 긴 문장 안에서 원하는 위치부터 시작해 날짜 부분만 골라 파싱할 수 있습니다.
예제 코드
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
String text = "Marriage date of Samrat is 2007-25-06";
// SimpleDateFormat 클래스 인스턴스 생성
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
// 주어진 텍스트에서 27번째 위치부터 날짜 파싱
ParsePosition pos = new ParsePosition(27);
Date date = formatter.parse(text, pos);
System.out.println("Date value: " + date);
}
}실행 결과
Date value: Mon Jun 25 00:00:00 IST 2007
참고 사항
SimpleDateFormat은 내부적으로 상태를 공유하기 때문에 스레드 세이프(thread-safe)하지 않습니다. 여러 스레드에서 동시에 사용하면 잘못된 결과가 나올 수 있으므로, 멀티스레드 환경에서는 ThreadLocal을 활용하거나 Java 8 이상에서 제공되는 java.time.format.DateTimeFormatter(불변 객체로 스레드 세이프)를 사용하는 것이 권장됩니다.