mysql에서 9시간 차이날때(GCP)

이태혁·2020년 8월 25일
11

1. javascript, json에서 시간 형식

"2020-05-11T02:00:00.000Z"
  • T는 날짜와 시간을 구분해주는 delimiter(구분자)이다. 그이외의 의미는 없다.
  • 끝에 Z는 영국 그리니치 천문대 시간을 가르킨다(+00:00). 한국은 (+09:00)이다.
    Z = Zulu time = GMT = UTC 다 같은말이다.

따라서 위의 5월 11일 오전 2시는 한국시간으로 5월 11일 11시로 봐야한다.

출처
1. Difference between UTC, GMT, Zulu Time, and Z
2. What exactly does the T and Z mean in timestamp?

2. mysql에서 날짜와 시간형식

mysql 날짜, 시간형식은 총 3가지이다.

  1. date: 날짜 (YYYY-MM-DD)
  2. datetime: 날짜와 시간(YYYY-MM-DD hh:mm:ss)
  3. timestamp: 날짜와 시간(YYYY-MM-DD hh:mm:ss[.fraction])

datetime과 timestamp 둘다 날짜와 시간을 적을 수 있는데 가장큰 차이는 타임 존 반영 유무다.
datetime은 타임존 정보가 없고
timestamp는 mysql서버의 타임존에 맞춰서 UTC시간을 띄워준다

예시

1. datetime 형식 예제 (타임존 정보 무시)

datetime 형식에 2020-08-25 11:00:00라고 입력시
쿼리문으로 요청하면 서버의 타임존 정보가 무엇이든 2020-08-25 11:00:00으로 나온다.

2. timestamp 형식 예제 (타임존 정보 반영가능)

timestamp 형식에 2020-08-25 11:00:00라고 입력시 현재 타임존이 Asia/Seoul이라면
2020-08-25 02:00:00으로 나온다. 출력된 시간은 UTC이기 때문에 2시라고 나왔지만 한국시간으로는 11시를 뜻한다.

mysql에 타임존 설정을 반영하고 싶으면 timestamp형식을 써야한다.

출처
1. 11.2.2 The DATE, DATETIME, and TIMESTAMP(MYSQL Official Docs)

3. mysql에서 타임존 설정 바꾸기

일단 아래 명령어로 mysql에서 현재 타임존을 확인하자.

select @@global.time_zone, @@session.time_zone,@@system_time_zone;


이렇게 나온다면 한국 타임존이 적용되어 있지 않아 mysql에 한국시간대를 입력하면 원하는 시간보다 -09:00으로 나올것이다.
실제로

select now();

이라고 치면 현재 컴퓨터 시간보다 -09:00된 시간이 나온다.(GCP에 경우)

SET GLOBAL time_zone='+09:00';
SET time_zone='+09:00';

위 명령어를 친뒤 다시 타임존을 확인해보면

이렇게 잘 바뀌어 있다.
또한

select now();

를 쳤을 때 현재 시간으로 잘 나온다.

참고 다른글에서는 +09:00대신 Asia/Seoul으로 치라고 하는데 저렇게 치면 계속 에러가 나서 +09:00으로 쳤었다. 혹시 에러가 나는사람은 글자가 아닌 숫자로 치길 바랍니다.

4. mysql설정파일에서 바꾸기

mysql을 재시작해야 하는경우 위 설정이 초기화된다.
재식작해도 설정이 남아있으려면 설정파일에서 바꿔야 한다.
아래 명령어로 설정파일을 열자

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

파일 맨밑에
default-time-zone="+09:00"
을 추가한다.
그리고 mysql을 재시작 한다. 재시작 하는 명령어는 2가지중 하나를 사용하면 된다.
1. service mysql restart
2. systemctl restart mysql.service

출처
[에러] mySQL timeZone 한국 설정 (우분투 리눅스)

추가1:javascript에서 UTC로 받은 시간을 KST(+09:00)으로 바꾸기

let timeSource = "2020-10-05T09:00:00.000Z"
let dateObj = new Date(timeSource);
console.log(dateObj); 

결과 2020-10-05T09:00:00.000Z

let timeString = dateObj.toLocaleString("en-US", {timeZone: "Asia/Seoul"});
let timeString_KR = dateObj.toLocaleString("ko-KR", {timeZone: "Asia/Seoul"});
console.log(timeString);
console.log(timeString_KR);

결과
10/5/2020, 6:00:00 PM
2020. 10. 5. 오후 6:00:00
en-US와 ko-KR은 시간을 바꾸진 않고 년월일 같은 형식과 언어를 바꿔준다.
뒤의 타임존이 부분이 반영되어 utc를 타임존에 맞는 시간대로 바꿔준다.

출처
1. https://stackoverflow.com/questions/10087819/convert-date-to-another-timezone-in-javascript
2. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString#:~:text=The%20toLocaleString()%20method%20returns,the%20behavior%20of%20the%20function.

추가2: mysql이 아닌 아예 서버 시간을 바꿀때

cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime
위 명령어를 쓰면 우분투 자체의 타임존 자체가 바뀐다는데 잘 되진 않았다.
출처: mysql 시간대(timezone) 변경하는 방법

다시 서버시간을 UTC로 되돌리는 명령어
ln -fs /usr/share/zoneinfo/UTC /etc/localtime
혹은 sudo timedatectl set-timezone UTC

출처
https://tlo-developer.tistory.com/78
https://stackoverflow.com/questions/930900/how-do-i-set-the-time-zone-of-mysql

profile
back-end, cloud, docker, web의 관심이 있는 예비개발자입니다.

2개의 댓글

comment-user-thumbnail
2020년 11월 8일

쩔었어요!

1개의 답글