[Java] 날짜 포맷 설정(SimpleDateFormat)


Development note/Java  2019. 7. 1. 22:59

안녕하세요. 명월입니다.


이 글은 java에서 날짜 포맷에 대한 글입니다.

사실 java에서 날짜 포맷을 사용하는 건 크게 어려운 일은 아닙니다.

단지, 저도 마찬가지지만 막상 사용하려고 하면 기억이 안나는 경우가 많습니다. C#의 경우는 데이터 포맷이 DateTime 클래스 안에 포함되어 있는 함수라서 그닥 잊어버릴 일은 없는데, java의 경우는 format 클래스가 따로 있어서 순간 어떻게 했더라 하는 경우가 있습니다.

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

public class DataFormatExample {
  public static void main(String[] args) {
    // 날짜 형식을 String으로 혹은 String을 날짜 형식으로 변환하기 위한 포맷형식이다.
    DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
    // Calendar형식에서 날짜를 가져온다. 특이점은 Calendar가 singleton 형식이다.
    // Date 값을 가져와서 String으로 변환한다.
    String datestr = format.format(Calendar.getInstance().getTime());
    System.out.println(datestr);
    
    // Date 객체를 선언해서 String으로 변환한다.
    datestr = format.format(new Date());
    System.out.println(datestr);
    
    // String 형식을 Date형식으로 변환한다.
    Date date = format.parse("2019/06/29");
    System.out.println(date);
  }
}

먼저 Date형식에서 String으로 변환, 혹은 String에서 Date형식으로 변환하는 건 SimpleDateFormat 클래스입니다. SimpleDateFormat 에서 포맷을 결정하는데 그 식은 아래와 같습니다.

링크 - https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html

문자 일시 및 시간 컴포넨트 표시 예제
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M Month in year (context sensitive) Month July; Jul; 07
L Month in year (standalone form) 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

예제 패턴입니다.

날짜 및 시간 패턴 결과
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3

참고로 Date 클래스를 가져오는 방식은 두가지 방식이 있습니다. Calendar.getInstance().getTime()와 new Date방식입니다.

일단 권장하는 방법은 Calendar를 통해 Date방식을 가져오는 걸 추천합니다.


이유인 즉, 시간이란 객체는 사실 생성한다는 건 어찌보면 맞는 것이고 틀린 이야기입니다. System에 흘러가는 시간은 고정으로 정해져 있고 local system에서 가져오는 값인데 그 객체를 new로 선언한다는 건 어쩌면 메모리 낭비일 수도 있다는 개념이기 때문일 것입니다.

그러나 흘러가는 시간에서 특정시간 객체를 생성해서 가져오는 생각으로 하면 new도 틀린 이야기 같지는 않습니다만 어쨋든 시간을 생성한다는 것은 많은 리소스가 사용되고 그로 인해 많은 버그의 가능성이 있다고 이야기합니다.


간단하게 이야기하면 new Date는 특정 시간의 날짜를 대입하여 계산하고, Calendar의 경우는 1900년 1월 1일의 기준으로 오늘 날짜의 차이로 날짜를 계산한다는 차이가 있다고 합니다.

참조 - https://stackoverflow.com/questions/368094/system-currenttimemillis-vs-new-date-vs-calendar-getinstance-gettime

참조 - https://stackoverflow.com/questions/20693131/difference-between-new-date-and-calendar-date/20693309


뭐 엄청 복잡합니다. 정확하게 알면 좋겠지만, 그냥 Calendar.getInstance를 사용하라고 하니 사용하는 유저는 그냥 API를 따라서 사용하는 것이 버그를 줄이는 길이곘습니다.


여기까지 Java에서 날짜 포맷을 다루는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.