Java/문자열

[Java]문자열을 날짜로 변환하는 방법

DevStory 2022. 4. 9.

문자열을 날짜로 변환하는 방법

Java 또는 모든 프로그래밍 언어에서 문자열을 날짜로 변환하는 작업은 빈번하게 발생합니다.

 

예를 들어서 Front-End에서 "20220131"이라는 문자열을 JSON 형태로 전달하여 Back-End에서 문자열이 날짜인지 검증하는 경우가 있겠습니다.

 

이번 포스팅에서는 Java에서 문자열을 날짜 객체로 변환하는 여러 가지 방법들을 소개합니다.


날짜 및 시간 기본 형식

Java에서 날짜 및 시간은 기본적으로 ISO-8601 형식으로 yyyy-MM-dd으로 표기합니다.

 

모든 날짜는 기본적으로 위 형식을 따르고 기본 포맷터를 사용하여 변환되는 모든 문자열은 위 형식을 따라야 합니다.


parse() 메서드

parse() 메서드에 문자열이 전달된 경우 ISO_LOCAL_DATE(yyyy-MM-dd) 형식을 사용하여 문자열을 날짜로 변환 가능한지 분석합니다.

parse(dateInString);

 

만약 ISO_LOCAL_DATE 형식이 아닌 다른 형식으로 표현하고 싶은 경우 두 번째 매개변수로 DateTimeFormatter 클래스를 사용합니다.

parse(dateInString, DateTimeFormatter);

문자열을 LocalDate로 변환

LocalDate는 ISO-8601 형식에서 시간 없이 날짜만 나타냅니다. 문자열을 LocalDate 객체로 변환하려면 다음과 같이 문자열을 전달합니다.

LocalDate localDate1 = LocalDate.parse("2021-01-31");
LocalDate localDate2 = LocalDate.parse("20210131", DateTimeFormatter.ofPattern("yyyyMMdd"));
LocalDate localDate3 = LocalDate.parse("2021/01/31",DateTimeFormatter.ofPattern("yyyy/MM/dd"));

System.out.println("localDate1: " + localDate1);
System.out.println("localDate2: " + localDate2);
System.out.println("localDate3: " + localDate3);

[실행 결과]

localDate1: 2021-01-31
localDate2: 2021-01-31
localDate3: 2021-01-31

 

위에서 언급했듯이 LocalDate는 기본적으로 ISO-8601 형식으로 해석합니다. parse() 메서드에 전달된 문자열이 "yyyy-MM-dd" 형식이 아닌 경우 DateTimeParseException가 발생합니다.

// DateTimeParseException 발생
LocalDate localDate = LocalDate.parse("20210131");

System.out.println("localDate: " + localDate);

문자열을 LocalTime으로 변환

LocalTime은 ISO-8601 형식으로 날짜 없이 시간만 나타냅니다. 초(second)는 생략 가능하지만 분(minute)은 생략할 수 없습니다.

LocalTime localTime1 = LocalTime.parse("14:10");
LocalTime localTime2 = LocalTime.parse("18:20:40");

System.out.println("localTime1: " + localTime1);
System.out.println("localTime2: " + localTime2);

[실행 결과]

localTime1: 14:10
localTime2: 18:20:40

문자열을 LocalDateTime으로 변환

LocalDateTime은 날짜와 시간 둘 다 사용할 수 있습니다.

LocalDateTime localDateTime = LocalDateTime.parse("2022-01-31T14:10");

System.out.println("localTime: " + localDateTime);

[실행 결과]

localTime: 2022-01-31T14:10

 

날짜와 시간 사이에 있는 문자열 "T"는 LocalDate와 LocalTime을 구분하기 위해 사용하는 구분자입니다. 

 

문자열 연월일시분초가 구분자 없이 정의된 경우 DateTimeFormatter을 "yyyyMMddHHmmss"으로 설정합니다.

LocalDateTime localTime = LocalDateTime.parse(
        "20220131141040", 
        DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        
System.out.println("localTime: " + localTime);

[실행 결과]

localTime: 2022-01-31T14:10:40

문자열을 ZonedDateTime으로 변환

만약, 다른 시간대로 처리하는 경우 ZonedDateTime 객체로 변환하고 싶은 경우 다음 코드처럼 타임존을 전달합니다.

ZonedDateTime zonedDateTime1 = ZonedDateTime.parse("2022-01-31T14:30:00+00:00[Europe/London]");
ZonedDateTime zonedDateTime2 = ZonedDateTime.parse("2022-01-31T14:30:00+00:00[Europe/Berlin]");
ZonedDateTime zonedDateTime3 = ZonedDateTime.parse("2022-01-31T14:30:00+00:00[Asia/Seoul]");
ZonedDateTime zonedDateTime4 = ZonedDateTime.parse("2022-01-31T14:30:00+00:00[America/Chicago]");

System.out.println("zonedDateTime1: " + zonedDateTime1);
System.out.println("zonedDateTime2: " + zonedDateTime2);
System.out.println("zonedDateTime3: " + zonedDateTime3);
System.out.println("zonedDateTime4: " + zonedDateTime4);

[실행 결과]

zonedDateTime1: 2022-01-31T14:30Z[Europe/London]
zonedDateTime2: 2022-01-31T14:30+01:00[Europe/Berlin]
zonedDateTime3: 2022-01-31T14:30+09:00[Asia/Seoul]
zonedDateTime4: 2022-01-31T14:30-06:00[America/Chicago]
반응형

java.util.Date

java.utill의 Date 클래스는 고전적인 방식이지만 때때로 Date 클래스를 사용해야 하는 경우가 존재합니다. SimpleDateFormat의 생성자에는 전달할 수 있는 수많은 패턴들이 존재합니다. 

try {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
    Date date = formatter.parse("2022/01/24");

    System.out.println(date);
} catch (ParseException ex) {
    ex.printStackTrace();
}

[실행 결과]

Mon Jan 24 00:00:00 KST 2022

SimpleDateFormat 객체에서 parse() 메서드를 호출하는 경우 문자열 분석을 실패하면 ParseException 예외가 발생합니다. 그러므로 try ~ catch문 또는 throws문을 사용하여 예외를 처리해주어야 합니다. 


SimpleDateFormat vs DateTimeFormatter

SimpleDateFormat과 DateTimeFormatter의 큰 차이가 없으므로 무엇을 사용할지 혼란스러울 수 있습니다.

 

DateTimeFormatter는 Java 8에 새로운 날짜 및 시간 클래스와 함께 도입되었으며 SimpleDateFormat을 대체합니다. SimpleDateFormat에 비해 안전하고 새로운 기능을 제공합니다.

 

Java 8 및 LocalDate, LocalTime, LocalDateTime, ZonedDateTime을 사용한다면 DateTimeFormatter를 사용하고 이전 버전을 사용하고 있다면 SimpleDateFormat을 사용합니다.


ApacheCommons

Apache Commons에서 지원하는 DateTimeConverter와 DateUtils를 사용하여 문자열을 날짜로 변환할 수 있습니다. 문자열을 날짜로 분석하지 못하는 경우 ParseException 예외가 발생합니다.


DateTimeConverter

DateTimeConverter dtc = new DateConverter();
dtc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd hh:mm:ss" });
ConvertUtils.register(dtc, Date.class);

DateUtils

Date date = DateUtils.parseDate(
        "22-Sep-2018", 
        new String[] {"dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy"});
반응형

댓글