Java에서는 날짜가 담긴 문자열을 Date 값으로 변환(파싱)하는 다양한 방법을 제공합니다. 대표적인 네 가지 방법은 다음과 같습니다.
- SimpleDateFormat 클래스: 생성자에 원하는 날짜 형식을 나타내는 문자열을 전달해 객체를 만든 뒤, parse() 메서드로 날짜 문자열을 파싱할 수 있습니다.
- LocalDate 클래스: parse() 메서드에 날짜 문자열을 전달하면 LocalDate 객체를 반환합니다. (Java 8 이상)
- DateUtils 클래스(Apache Commons): org.apache.commons 패키지에서 제공하는 날짜 유틸리티로, parseDate() 메서드에 형식 문자열과 날짜 문자열을 전달하면 Date 객체를 반환합니다.
- Instant 클래스: java.time.Instant의 parse() 메서드에 날짜 문자열을 전달하면 해당 시점을 나타내는 Instant 객체를 반환합니다.
1. SimpleDateFormat 클래스 사용하기
가장 전통적인 방식으로, java.text 패키지의 SimpleDateFormat 클래스를 활용합니다. 생성자에 "yyyy-dd-MM"처럼 원하는 패턴을 지정하고 parse() 메서드를 호출하면 됩니다. 단, 이 클래스는 스레드에 안전하지 않으므로 멀티스레드 환경에서는 주의해야 합니다.
예제
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Sample {
public static void main(String args[]) throws ParseException {
String dateString = "2007-25-06";
// SimpleDateFormat 클래스 인스턴스 생성
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-dd-MM");
// 문자열을 Date 객체로 파싱
Date date = formatter.parse(dateString);
System.out.println("Date value: " + date);
}
}
출력 결과
Date value: Mon Jun 25 00:00:00 IST 2007
* 출력되는 시간대(IST, KST 등)는 시스템의 기본 로캘 설정에 따라 달라질 수 있습니다.
2. LocalDate 클래스 사용하기
Java 8부터 도입된 java.time API의 LocalDate 클래스는 ISO-8601 형식(yyyy-MM-dd)의 문자열을 별도의 패턴 지정 없이 간단하게 파싱할 수 있어 가장 깔끔한 방법으로 꼽힙니다.
예제
import java.time.LocalDate;
public class Test {
public static void main(String args[]) {
LocalDate date = LocalDate.parse("2007-12-03");
System.out.println(date);
}
}
출력 결과
2007-12-03
3. DateUtils 클래스 사용하기
Apache Commons Lang 라이브러리의 org.apache.commons.lang3.time.DateUtils 클래스는 여러 형식을 한 번에 시도할 수 있는 편리한 parseDate() 메서드를 제공합니다. 아래 예제에서는 "07-06-2013" 문자열을 "dd-MM-yyyy" 패턴으로 파싱합니다.
예제
import java.text.ParseException;
import java.util.Date;
import org.apache.commons.lang3.time.DateUtils;
public class Test {
public static void main(String args[]) throws ParseException {
String dateInString = "07-06-2013";
Date date = DateUtils.parseDate(dateInString, "dd-MM-yyyy");
System.out.println(date);
}
}
출력 결과
Fri Jun 07 00:00:00 KST 2013
4. Instant 클래스 사용하기
java.time.Instant 클래스는 UTC 기준의 특정 시점을 표현하며, parse() 메서드는 ISO-8601 형식(예: 2014-10-05T15:23:01Z)의 문자열만 처리할 수 있습니다.
예제
import java.time.Instant;
public class Test {
public static void main(String args[]) {
String dateInString = "2014-10-05T15:23:01Z";
Instant instant = Instant.parse(dateInString);
System.out.println(instant);
}
}
출력 결과
2014-10-05T15:23:01Z
어떤 방법을 선택해야 할까?
Java 8 이상을 사용한다면 스레드 안전성과 불변성이 보장되는 java.time API(LocalDate, Instant 등)를 사용하는 것이 가장 권장됩니다. 여러 날짜 형식을 유연하게 처리해야 하거나 레거시 프로젝트라면 Apache Commons의 DateUtils가 유용하며, SimpleDateFormat은 사용이 간단하지만 스레드에 안전하지 않으므로 멀티스레드 환경에서는 ThreadLocal 등으로 관리해야 합니다.