개요
데이터 조회 결과를 엑셀로 다운로드 하는 기능이 있는데, 요구사항으로 해당 엑셀 다운로드 양식에 로그 시간을 추가해달라는 요청이 들어왔다. 로그 ‘시간’’ 이길래 자연스럽게 DATETIME를 생각하고 해당 테이블을 확인했는데 로그 시간을 기록한 컬럼의 타입이 DATETIME이 아닌 int 이고 1696863600 과 같은 식으로 데이터가 저장 되있었다. 유닉스 타임 스탬프를 통해 저장한다는 사실을 알고 기록 하려한다.
정리
유닉스 타임 스탬프란?
일단 유닉스 타임스탬프란 1970년 1월 1일 00:00:00 UTC로 부터 경과한 시간을 초 단위로 나타낸 정수 값이다. 1970년 1월 1일을 기준으로 정한 이유는 유닉스 시스템이 개발된게 1970년 대 초반이였고 컴퓨터 시스템 간 시간을 표현하고 처리하는 표준이 필요했기 때문이다.
💡 글을 작성하는 2024년 9월 20일 11시로 계산을 하면, 유닉스 시간은 1726797600 이다.
왜 사용할까?
- 전 세계 컴퓨터 시스템에서 일관된 시간을 표기할 수 있다. 지구는 자전하므로 경도에 따라서 나라 마다 시차가 다르다. 하지만 유닉스 타임 스탬프는 정해진 기준에서 얼마나 시간이 경과했는지를 나타낸 것이기 때문에 데이터의 표준으로 일관성을 유지할 수 있다.
- 정수로 표현되기 때문에 시간 간격을 계산하기가 쉽다.
- 데이터 베이스에 저장될 때, 유닉스 타임 스탬프는 일반적인 날짜와 시간 표현보다 작은 공간을 차지한다.
언제 사용할까?
- 서버나 컴퓨터에서 발생하는 이벤트를 기록할 때 타임스탬프를 사용해서 시간 정보를 남긴다.
- 데이터의 생성, 수정 또는 삭제 시간을 기록할 때 사용한다.
- 시간 관련 연산을 수행할 때 사용하며, 특히 시간 간격을 계산하는데 유용하다.
- 파일 전송 프로토콜과 같은 인터넷 프로토콜에서 시간 정보를 전달할 때 사용한다.
어떻게 사용할까?
DBMS 별로 유닉스 타임스탬프를 사용하는 방법이 다르다. MYSQL 같은 경우는 UNIX_TIMESTAMP() 라는 내장 함수를 제공해서 간단하게 유닉스 타임스탬프를 출력할 수 있다. 반면에 오라클, MS SQL 서버는 별도로 유닉스 타임스탬프 함수를 제공하지 않는다. 유닉스 타임스탬프를 출력하기 위해서 현재 시간에서 기준시를 임의로 빼는 방식으로 응용해서 적용한다.
유닉스 타임을 DATE로 변환하기
SELECT FROM_UNIXTIME(1726797600)
# 유닉스 타임 스탬프 값을 'YYYY-MM-DD HH:mm:ss'로 변환 후 출력
SELECT date_format(FROM_UNIXTIME(1726797600),'%Y-%m-%d %H:%i:%S')
DATE를 유닉스 타임으로 변환하기
SELECT UNIX_TIMESTAMP('2024-09-20 11:00:00')
쿼리 시 주의사항
유닉스 타임스탬프는 UTC 기준이다. UTC는 Coordinated Universal Time, 협정 세계시로 전 세계의 기준 시간대로 사용된다. ‘시간대의 기준점’ 으로서, 다른 모든 지역 시간의 기준이된다.
KTC (Korean Standard Time)는 UTC 보다 9시간을 앞서가기 떄문에 우리는 UTC +9 라고 부른다.
그렇기 때문에 UTC 국가에 거주하지 않는 이상, 유닉스 타임을 취급할 떄는 항상 로컬로 변경하는 추가 작업이 필요하다
SELECT
FROM_UNIXTIME(UNIX_TIMESTAMP()) AS current_utc_time,
FROM_UNIXTIME(UNIX_TIMESTAMP() + 9 * 3600) AS current_kst_time; // kst 로 변환
후기
그렇게 반환된 값을 LocalDateTime 타입으로 매핑하였고, 해당 LocalDateTime을 toString 해보니 이런식으로 데이터가 나왔다.

LocalDateTime을 toString 하면 ISO-8601 형식으로 출력되기 때문에, 날짜와 시간 사이에 T 가 포함된다. 그래서 DateTimeFormatter를 이용하여 원하는 형식으로 만들었다.
LocalDateTime logDate = testDto.getLogDt()
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
logDate.format(formatter)
