[Java/자바] SimpleDateFormat 클래스 (날짜 데이터 출력)

Date와 Calendar로 날짜를 계산할 수 있지만, 이 두 클래스만으로 날짜 데이터를 원하는 형태로 다양하게 출력하는 것은 불편합니다.

그래서 날짜 데이터를 원하는 형태로 출력하기 위해 SimpleDateFormat를 사용합니다.

 

SimpleDateFormat 작성에 사용되는 기호 표
기호 의미
G BC (기원전) / AC (기원후)
y 년도
M 월(1 ~ 12)
w 년의 몇 번째 주(1 ~ 53)
W 월의 몇 번째 주(1 ~ 5)
D 년의 몇 번째 일(1 ~ 366)
d 월의 몇 번째 일(1 ~ 31)
F 월의 몇 번째 요일(1 ~ 5)
E 요일
a 오전(AM) / 오후(PM)
H 시간(0 ~ 23)
k 시간(1 ~ 24)
K 오전/오후 시간 (0 ~ 11)
h 오전/오후 시간 (1 ~ 12)
m 분 (0 ~ 59)
s 초 (0 ~ 59)
S 천분의 일초 - Millisecond(0 ~ 999)
z General 타임존( GMT+9:00)
Z RFC 822 타임존(+0900)
` escape문자 (특수문자 표현에 사용)

 


SimpleDateFormat 예제

 

다양한 출력 패턴

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

 class DateFormatEx {
    public static void main(String[] args) {
        Date today = new Date();

        SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
        SimpleDateFormat sdf5, sdf6, sdf7;

        sdf1 = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
        sdf2 = new SimpleDateFormat("yy년, MMM d일, E요일");
        sdf3 = new SimpleDateFormat("zzzz - a h:mm ");
        sdf4 = new SimpleDateFormat("z K:mm a"); ////
        sdf5 = new SimpleDateFormat("G yyyy년.MMM.dd일 a hh:mm ");
        sdf6 = new SimpleDateFormat("yyyy MMM d일 E요일 HH:mm:ss Z");
        sdf7 = new SimpleDateFormat("yyyy MMM d일 E요일 kk:mm:ss Z");

        System.out.println(sdf1.format(today));
        System.out.println(sdf2.format(today));
        System.out.println(sdf3.format(today));
        System.out.println(sdf4.format(today));
        System.out.println(sdf5.format(today));
        System.out.println(sdf6.format(today));
        System.out.println(sdf7.format(today));
    }
}

 

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

class DateFormatEx1 {
    public static void main(String[] args) {
        Date today = new Date();

        SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
        SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;

        sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
        sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

        sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
        sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
        sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
        sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주입니다.");
        sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일입니다.");

        System.out.println(sdf1.format(today));
        System.out.println(sdf2.format(today));
        System.out.println(sdf3.format(today));
        System.out.println(sdf4.format(today));
        System.out.println();
        System.out.println(sdf5.format(today));
        System.out.println(sdf6.format(today));
        System.out.println(sdf7.format(today));
        System.out.println(sdf8.format(today));
        System.out.println(sdf9.format(today));
    }
}

 

Calendar인스턴스를 Date인스턴스로 변환하여 출력

Date인스턴스만 format 메서드에 사용될 수 있기 때문에 Calendar인스턴스를 Date인스턴스로 변환합니다.

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

    class DateFormatEx2 {
        public static void main(String[] args) {
            // Calendar와 Date간의 변환은 다음과 같이 한다.
            Calendar cal = Calendar.getInstance();
            cal.set(2005, 9, 3);	// 2005년 10월 3일

            Date day = cal.getTime();

            SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
            sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            sdf2 = new SimpleDateFormat("yy-MM-dd E요일");
            sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

            System.out.println(sdf1.format(day));
            System.out.println(sdf2.format(day));
            System.out.println(sdf3.format(day));
            System.out.println(sdf4.format(day));
        }
    }

 

parse(String source)를 사용해 날짜 데이터의 출력형식 변환

parse(String source)는 문자열을 날짜 Date인스턴스로 변환해줍니다.

이를 이용함으로써, 날짜 데이터를 문자열로 입력받을 때, 입력받은 문자열을 날짜로 인식하기 위해 substring메서드로 "년,월,일"을 뽑아낼 필요 없이 parse()로 간단하게 뽑아낼 수 있습니다.

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

class DateFormatEx3 {
    public static void main(String[] args) {
        DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
        DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

        // 지정된 형식과 입력된 형식이 일치하지 않는 경우 예외가 발생하므로 예외 처리 필요.
        try {
            // parse(String source)는 문자열을 날짜 Date인스턴스로 변환해준다.
            Date d = df.parse("2023년 1월 1일");
            System.out.println("d : " + d);
            System.out.println("df : " + df.format(d));
            System.out.println("df2 : " + df2.format(d));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

날짜를 입력받아 계산결과 출력

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

class DateFormatEx4 {
    public static void main(String[] args) {
        String pattern = "yyyy/MM/dd";
        DateFormat df = new SimpleDateFormat(pattern);
        Scanner input = new Scanner(System.in);

        Date inputDate = null;

        System.out.println("날짜를 " + pattern + "의 형태로 입력해주세요.(입력예:2023/12/31)");
        // hasNextLine()은 다음에 읽을 값이 있는지 확인한다.
        while (input.hasNextLine()) {
            try {
                inputDate = df.parse(input.nextLine());
                break;
            } catch (Exception e) {
                System.out.println("날짜를 " + pattern + "의 형태로 다시 입력해주세요.(입력예:2023/12/31)");
            }
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(inputDate);

        Calendar today = Calendar.getInstance();
        long day = (cal.getTimeInMillis() - today.getTimeInMillis()) / (60 * 60 * 1000);

        System.out.println("입력하신 날짜는 현재와 " + day + "시간 차이가 있습니다.");
    }
}