본문 바로가기

개발언어/Java _ Spring

[Java]날짜 데이터를 원하는 형식(패턴)으로 표현하자! SimpleDateFormat

활용

날짜데이터를 저장하는 컬럼 REQ_START_DT는 '20230301'(yyyyMMdd) 형태로 데이터를 저장하는 컬럼이다 

위의 사진처럼 DB에서는 날짜데이터를 문자열 데이터 형태로 저장하는 경우도 있는데 이 부분에 대한 설명은 다른 포스팅에서 다룬 적이 있다. 

 

https://hirodevelodiary.tistory.com/entry/MYSQL-%EB%82%A0%EC%A7%9C%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B3%A0%EC%9E%90-%ED%95%A0-%EB%95%8C%EC%9D%98-%EC%9E%90%EB%A3%8C%ED%98%95-%EB%82%A0%EC%A7%9C%ED%98%95DATETIME%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-%EB%AC%B8%EC%9E%90%EC%97%B4VARCHAR%ED%83%80%EC%9E%85%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C

 

[MYSQL] 날짜데이터를 저장하고자 할 때의 자료형_ 날짜형(DATETIME)을 사용할까? , 문자열(VARCHAR)타입

DB에서 날짜데이터는 데이터의 입출력의 로그를 남기거나, 스케줄을 제한하여 특정기능을 여는 등에 많은 부분에서 다양하게 활용된다. 그렇기에 쿼리에서도 기본적인 날짜 데이터 자료형을 지

hirodevelodiary.tistory.com

 

해당 데이터는 문자열 형태로 지정이 되어있기때문에 코드상에서 날짜의 이전, 이후 등의 비교연산을 해야 하는 경우 문자열 형태에서는 비교연산이 불가하여 Type casting오류가 발생하게 된다. 

 

개요

SimpleDateFormat는java의 text 패키지에 속한 Java SE API에서 기본제공하는 클래스로 String타입으로 날짜를 표기한 데이터를 Date타입으로 변환하고, 해당 날짜데이터를 다양한 패턴으로 지정하는 등 문자열-날짜 type Casting에 다용도로 활용할 수 있는 클래스이다.

SimpleDateFormat 클래스는 날짜와 시간을 원하는 형식으로 표시하기 위한 클래스이다. 날짜와 시간을 다양한 형식으로 변환할 수 있도록 해주는데, 지정한 패턴에 따라 포맷을 지정하여 문자열로 변환하거나, 문자열을 파싱 하여 Date 객체로 변환할 수 있다.

 

예를 들어,

SimpleDateFormat 클래스는 다양한 패턴을 지원하며, 년, 월, 일, 시, 분, 초 등을 포함한 다양한 요소를 사용하는 형식을 지정할 수 있다.

 

선언문 문법
SimpleDateFormat instanceName = new SimpleDateFormat("yyyyMMdd");

선언문에서 매개변수로 들어간 "yyyyMMdd"는

변수에 넣고자 하는 데이터의 포맷을 지정한다.

예를들어 데이터가 20230301로 데이터가 들어온다면 "yyyyMMdd"로,

2023-03-01로 데이터가 들어온다면 "yyyy-MM-dd"로 지정한다


이외에도 자주 쓰이는 패턴의 예시 (2023년3월9일 오전11시22분00초 기준)

패턴 설명 예시
yyyy-MM-dd 년-월-일 2023-03-09
HH:mm:ss 시:분:초 11:22:00
yyyy-MM-dd HH:mm:ss 년-월-일- 시:분:초 2023-09-09 11:22:00
EEE, MMM d, ''yy 요일, 월(단축명),일, 연도(두 자리수) 수,3월 9, '23
yyyy-MM-dd'T'HH:mm:ss.SSSZ ISO 8601 국제 표준방 2023-03-09T11:22:00.000+0000

 

SimpleDateFormat클래스의 생성자에서는 문자열 패턴을 매개변수로 받는데 이 패턴을 지정하지 않으면 기본 패턴을 사용하게 되며 기본 패턴은 운영체제의 지역화 설정에 따라 적용되기도 한다.

다시말해 매개변수는 필수값은 아니지만 필요에 따라 명시해 주는 것이 좋다. 

 

SimpleDateFormat의 주요 메서드
  1. parse(String source) : 문자열을 Date 객체로 파싱 한다
  2. format(Date date) : Date 객체를 문자열로 변환한다.
  3.  toPattern() : SimpleDateFormat 객체의 패턴을 반환한다.
  4. applyPattern(string pattern) : SimpleDateFormat객체의 패턴을 변경한다.
  5. setTimeZone(TimeZone zone) : SimpleDateFormat을 사용할 Timezone을 설정한다  

 

활용코드 

mybatis의 쿼리를 이용하여 REQ_START_DT와 REQ_END_DT 컬럼의 데이터를 List<Map<>>형태로 가져온다 이후 데이터의 비교연산을 위해 SimpleDateFormat의 parse()를 활용하여 데이터 패턴을 지정하여 반환하였다.

public Map<String, Object> isValidReqDate(Map<String, Object> param) throws Exception {
        String reqStartDateStr = null;
        String reqEndDateStr = null;

        Date reqStartDate = null;
        Date reqEndDate = null;

        List<Map<String, Object>> reqDateList = schMapper.getReqDateList(param);

        if (reqDateList == null || reqDateList.isEmpty()) {
            throw new Exception("Failed to get request date list");
        }

        for (Map<String, Object> map : reqDateList) {
            reqStartDateStr = (String) map.get("REQ_START_DT");
            reqEndDateStr = (String) map.get("REQ_END_DT");
        }
        
        // 가져온데이터는 문자열형태이기때문에 SimpleDateFormat로 타입 변환후
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        // 생성자에서 지정한 패턴으로 파싱한다 parse()
        reqStartDate = formatter.parse(reqStartDateStr);
        reqEndDate = formatter.parse(reqEndDateStr);

        Map<String, Object> reqDateMap = new HashMap<>();
        reqDateMap.put("reqStartDate", reqStartDate);
        reqDateMap.put("reqEndDate", reqEndDate);

        return reqDateMap;
    }

 

 특이사항

SimpleDateFormat은 여러 스레드가 동시에 사용되는 멀티스레드의 환경에서 사용할 경우 동시에 여러 스레드가 접근하여 수정하거나 사용하는 경우가 발생할 수 있으므로 sychronized 등을 사용하여 동기화 처리가 필요하다.