본문 바로가기
JAVA

[JAVA] 기본 날짜 포맷을 내 맘대로 바꾸기 (SimpleDateFormat)

by 청양호박이 2021. 5. 8.

프로그래밍을 하다보면, 서비스를 위해서 오늘날짜를 가져와야 할 상황이 발생합니다. 하지만, JAVA의 Date클래스를 사용하면 내가 원하는 포맷의 날짜를 보여주지 않습니다. 왜냐하면, 보통의 서비스에서 날짜를 기준으로 서비스하는 경우에는 yyyy-MM-dd (ex. 2021-05-08)과 같은 형태이거나 기타 유사한 형태를 사용해야 하기 때문입니다. 

 

그래서 이번에는 Date클래스를 통해서 얻어온 날짜 정보를 가지고, 내가 원하는 포맷으로 바꾸는 방법에 대해서 알아보겠습니다. 간단한 코드지만 어느범위까지 변경이 가능한지 눈으로 확인해 보겠습니다. 

 

 

1. Class SimpleDateFormat ?


SimpleDateFormat의 구조는 아래와 같습니다. 

java.lang.Object
    java.text.Format
        java.text.DateFormat
            java.text.SimpleDateFormat

이 Class는 날짜를 Text로 만들어주는 포맷변경과, Text를 날짜로 만들어주는 분석기능을 제공하는 녀석입니다. 이를 사용해서 사용자가 원하는 형태로 만들어서 (사용자 정의 패턴) String으로 변경이 가능합니다. 우리가 하고자하는 목표를 이루게 해주는 Class가 맞네요.

 

사용자 정의 패턴을 만들기 위해서는 영문 대문자(A-Z)와 영문 소문자(a-z)로 구성됩니다. 하지만 날짜 및 시간을 위한 패턴 문자열은 아래와 같이 사전에 정의가 되어있습니다. 

Letter Date or Time Component Presentation Examples
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day name in week Text Tuesday; Tue
u Day number of week (1 = Monday, ..., 7 = Sunday) Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00

[출처 : docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html]

 

 

2. 포맷변경 (날짜 -> Text)


이제 사용을 해보겠습니다. 우선 오늘 날짜를 받아오기 위해서 Date class를 사용해서 확인을 해 보겠습니다.

 

[SimpleDateFormatTest.class]

import java.util.Date;

public class SimpleDateFormatTest {

	public static void main(String[] args) {
		
		Date toDay = new Date();
		System.out.println(toDay);

	}

}

[결과]

Sat May 08 09:19:08 KST 2021

참으로 사용하기 어렵게 영문자로 된 Date를 리턴해 줍니다. 이제 위의 패턴 문자열을 사용해서 사용자정의 패턴을 만들어서 포맷을 변경해 보겠습니다. 추가적으로 사전에 패턴 문자열로 지정된 알파벳을 사용하고 싶을때가 있을 것 입니다. 이때는 작은따옴표(' ')를 사용해서 추가할 수 있습니다.

 

[SimpleDateFormatTest.class]

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatTest {

	public static void main(String[] args) {
		
		Date toDay = new Date();
		System.out.println(toDay);
		
		// 일반적인 형태의 포맷 변환
		SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd M월 W번째 주");
		String toDayFormat = SDF.format(toDay);
		System.out.println(toDayFormat);
		
		// 패턴 문자열로 지정된 알파벳을 문자로 사용하여 포맷 변환
		SimpleDateFormat SDFAdd = new SimpleDateFormat("yy-MM-dd G 'yyMMdd' z");
		String toDayFormatAdd = SDFAdd.format(toDay);
		System.out.println(toDayFormatAdd);

	}

}

[결과]

Sat May 08 09:41:22 KST 2021
2021-05-08 5월 2번째 주
21-05-08 AD yyMMdd KST

위에서 만든 사용자정의 패턴 2가지를 통해서 정상적으로 변경됨을 확인할 수 있습니다. 추가적으로 작은따옴표를 통해서 원하는 단어도 추가해서 넣을 수 있습니다. 심지어 지정된 패턴 문자열이 포함되어 있더라고 말이죠.

 

 

3. 분석 (Text -> 날짜)


이번에는 Text를 날짜 형태로 바꿔보도록 하겠습니다. 우선 코드부터 확인하고 설명해 보겠습니다.

 

[SimpleDateFormatTest.class]

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatTest {

	public static void main(String[] args) {
		
		// String 형태의 데이터 
		String toDay2 = "20210508";
		// 포맷지정
		SimpleDateFormat fromFormat = new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat toFormat = new SimpleDateFormat("yyyy-MM-dd M월 W번째 주");
		try {
			// String을 Date로 변경
			Date fromDate = fromFormat.parse(toDay2);
			System.out.println(fromDate);
			// Date를 사용자정의 패턴으로 변경
			String toDate = toFormat.format(fromDate);
			System.out.println(toDate);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}

[결과]

Sat May 08 00:00:00 KST 2021
2021-05-08 5월 2번째 주

우선 Sting으로 날짜 형태로 보이는 문자열을 입력해줍니다. 그리고 해당 String에 맞는 날짜 패턴을 사용자 정의 패턴으로 만들어 줍니다. 그 다음으로... 이렇게 정의된 SimpleDateFormat에서 제공되는 parse method로 Date 형태로 변환이 되게 됩니다. 

 

그럼 이렇게 변환된 Date를 통해서 다시 사용자 정의 패턴을 적용해서 변경하는 것은 쉬운 일이 됩니다.

 

- Ayotera Lab -

댓글