MySQL의 시간대를 어떻게 설정합니까?


339

한 서버에서 내가 실행할 때 :

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)

다른 서버에서 :

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)

여기에는 시간대 차이가있을뿐 아니라 그다지 중요하지 않은 타임 드리프트도 있습니다. "DBA에 대해 이야기하고 자신 ntp에게 적합한 것을 확인하십시오!"
colm.anseo 2016 년

@ colm.anseo Calm down 아마도 쿼리 실행의 차이 일 것입니다.
HosseyNJF

1
@HosseyNJF까지 7 분? 비교할 때 커피를 마시는가?
colm.anseo

답변:


525

나는 이것이 유용 할 것이라고 생각했다.

MySQL에서 시간대를 설정할 수있는 위치는 세 곳입니다.

[mysqld] 섹션의 "my.cnf"파일에서

default-time-zone='+00:00'

@@ global.time_zone 변수

어떤 값으로 설정되어 있는지 확인하려면 :

SELECT @@global.time_zone;

값을 설정하려면 다음 중 하나를 사용하십시오.

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';

'유럽 / 헬싱키'와 같은 명명 된 시간대를 사용하면 시간대 표를 올바르게 채워야합니다.

+02:00오프셋 임을 명심하십시오 . Europe/Berlin시간대 (두 오프셋이 있음)이고CEST 특정 오프셋에 해당하는 클럭 시간입니다.

@@ session.time_zone 변수

SELECT @@session.time_zone;

설정하려면 다음 중 하나를 사용하십시오.

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

둘 다 SYSTEM을 리턴 할 수 있습니다. 이는 my.cnf에 설정된 시간대를 사용함을 의미합니다.

시간대 이름이 작동하려면 시간대 정보 테이블을 채우도록 설정해야합니다 ( http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html) . 또한 이 답변 에서 해당 테이블을 채우는 방법에 대해서도 언급합니다 .

현재 시간대 오프셋을 다음과 같이 얻으려면 TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

시간대가 +2 : 00이면 02:00:00을 반환합니다.

현재 UNIX 타임 스탬프를 얻으려면

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());

타임 스탬프 열을 UNIX 타임 스탬프로 가져 오려면

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

UTC 날짜 / 시간 열을 UNIX 타임 스탬프로 가져 오려면

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

참고 : 시간대 를 변경해도 저장된 날짜 시간 또는 타임 스탬프는 변경되지 않습니다. 않지만 기존 타임 스탬프 열은 내부적으로 UTC 타임 스탬프로 저장되고 현재 MySQL 시간대에 외부로 표시되므로 기존 타임 스탬프 열에 대해 다른 날짜 시간을 표시합니다.

여기에 치트 시트를 만들었습니다 : MySQL의 시간대를 UTC로 설정해야합니까?


3
+00:00시간대가 아니라 시간 오프셋입니다. DST와 관련하여 어떤 일이 발생합니까? 1 년 내내 +0에 유지됩니까?
mpen

1
@ Mark 확실하지 않습니다 . 문서 를 설정 time_zone="+00:00"하면 설정 값이 변경되지 않고 UTC가 DST를 따르지 않는다는 점을 고려하여 UTC 오프셋을 사용 하여 시간대 를 설정한다고 일년 내내 동일하게 유지된다고 가정 할 수 있습니다.
Timo

1
@TimoHuovinen 죄송합니다. +00:00 . 오프셋처럼 보이 므로 MySQL이 문자열 "UTC"자체를 사용하는 대신 UTC를 나타내도록 선택하는 것이 이상합니다. 정보 주셔서 감사합니다.
mpen

1
+00 : 00을 설정했지만 다음 오류가 발생합니다. error : 구성 파일에서 선행 그룹없이 옵션을 찾았습니다. /etc/my.cnf
János

5
Win7에서 mysql 설정 파일의 경로는C:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca

83

여전히이 문제가있는 사람 :

value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"

나를 위해 일했다. ?serverTimezone=UTC끝에 추가 하십시오.


내 시간대가 UTC + 7 인 경우 연결 문자열에서 어떻게 지정할 수 있습니까? "? serverTimezone = UTC + 7"을 추가하려고 시도했지만 작동하지 않습니다.
Chiến Nghê

1
문제는 JDBC에 관한 것이 아니라 MySQL 자체에 관한 것이었다.
Luiz

2
@ ChiếnNghê : BTW Asia/Ho_Chi_Minh대신 사용해야 UTC합니다. 문제는 MySQL 시간대 변경에 관한 것입니다. @Timo 답변을 참조하십시오. MySQL 도커에 문제가 있으면 TZ 환경을 추가하면 작동합니다.
Liem Le

2
이것은 단지 서버 시간대를 JDBC 에게 알려주고 변경 하지는 않습니다 . 세션 시간대를 설정하려면 다음을 사용하여 답변을 확인하십시오SET time_zone=...
Nikola Mihajlović

CDT 오류가 발생했지만 문제가 해결되었습니다.
Akexis

58

MySQL 또는 PHP 용 시간대 서버를 구성 할 수있는 경우 :

생각해 내다:

  1. 시간대 시스템을 변경하십시오. 우분투의 예 :

    $ sudo dpkg-reconfigure tzdata
  2. 서버를 다시 시작하거나 Apache 2 및 MySQL을 다시 시작할 수 있습니다.

    /etc/init.d/mysql restart

2
어쩌면이 접근법이 옳지 않을 수도 있습니다. UTC를 사용하는 서버가있는 상황에 대해 생각하지만 애플리케이션이 UTC -0600의 국가에 데이터를 제공하고 있습니다. MySQL의 시간대를 조정하면 훨씬 좋습니다.
ivanleoncz

1
특히 여러 시간대를 다루는 지역에서 일하는 경우.
Alexis Wilke

57

현재 세션에 설정하려면 다음을 수행하십시오.

SET time_zone = timezonename;

14
선택 @@ session.time_zone;
James Skidmore

1
시스템에서 일부 오류를 수정하려고하는데 time_zone을 GMT가 아닌 UTC로 설정해야합니다. '-0 : 00'또는 '+00 : 00'으로 설정 한 경우 UTC 주석 또는 GMT 주석인지 알고 있습니까? 이 특정 정보를 찾지 못했습니다. 건배!
rafa.ferreira

@ Castanho, 어느 쪽이든 잘 작동 할 것이라고 확신합니다. 이 질문에 대한 설명을 확인하십시오 : stackoverflow.com/questions/3466630/…
James Skidmore

시간대 값은 PHP에서 설정 한 것과 동일 할 수 있습니다 (예 :) SET time_zone = 'America/Boise'. 답장 해 주셔서 감사합니다. James Skidmore!
Adam F

1
@the_nuts 예, SET time_zone = 'UTC';설정은 서버를 다시 시작하는 동안 분실
티모 Huovinen

48

MySQL 서버에서 간단히 실행하십시오.

SET GLOBAL time_zone = '+8:00';

시간대는 +8 : 00입니다.


14
이것은 Mysql을 재시작 할 때까지만 일시적인 것입니다
rubo77

DB에 연결할 때 수퍼 유저 권한이있는 경우는 거의 없습니다. @@session.time_zone다른 답변에서 설명한대로 설정 하는 것이 훨씬 좋습니다.
colm.anseo

16

이것은 인도의 한 위치에서 나를 위해 일합니다.

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";

이것을 mysql에서 쿼리로 실행하거나 다음과 같은 구문으로
default.time

11

서버를 시작할 때 서버의 기본 시간대를 지정할 수 있습니다 . http://dev.mysql.com/doc/refman/5.1/en/server-options.html 및 특히 --default-time-zone=timezone옵션을 참조 하십시오 . 당신은 글로벌 및 세션 시간대를 확인할 수 있습니다

SELECT @@global.time_zone, @@session.time_zone;

다음 SET문장으로 설정하십시오 . & c; 자세한 내용 은 http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html 을 참조 하십시오 .


11

'국가 / 지역'이 때때로 작동하지 않는다는 점을 명심하십시오.이 문제는 OS, MySQL 버전 및 하드웨어에 따라 다릅니다. 2003 년 FreeBSD 4 및 Slackware Linux 이후로 지금까지이 문제를 해결했습니다. 버전 3에서 최신 소스 트렁크까지의 MySQL. ODD이지만 발생합니다. 예를 들면 다음과 같습니다.

root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8

drwxr-xr-x  2 root root 4096 Apr 10  2013 .
drwxr-xr-x 22 root root 4096 Apr 10  2013 ..
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx  1 root root   21 Jul  8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx  1 root root   15 Jul  8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx  1 root root   37 Jul  8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx  1 root root   19 Jul  8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   20 Jul  8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#

그리고 그런 진술은 효과가 있습니다.

SET time_zone='US/Eastern';

그러나이 문제가 있습니다.

오류 코드 : 1298. 알 수 없거나 잘못된 시간대 : 'EUS / Eastern'

영역 정보 디렉토리의 하위 폴더를보고 symlink의 실제 파일 이름 (이 경우 EST5EDT)을 참조하십시오. 그런 다음 대신이 진술을 시도하십시오.

SET time_zone='EST5EDT';

그리고 실제로 예상대로 작동합니다! :)이 트릭을 명심하십시오. 나는 그것이 MySQL 매뉴얼과 공식 문서에 문서화되어있는 것을 보지 못했습니다. 그러나 해당 문서를 반드시 읽어야합니다. MySQL 5.5 표준 공식 문서 -서버에 표준 데이터를로드하는 것을 잊지 마십시오 (루트 사용자로 실행).

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

트릭 1 위-MySQL 루트 사용자로 정확하게 수행해야합니다. MySQL 데이터베이스에 대한 모든 액세스 권한을 가진 사용자조차도 실패하거나 작동하지 않을 수 있습니다-결함을 직접 보았습니다.


Ubuntu 데스크탑 및 서버에서 일부 사례가 있음을 알려주세요.
Alexey Vesnin


7

이것은 10 살짜리 질문이지만 어쨌든 여기 나를 위해 일한 것이 있습니다. Hibernate 5 및 SpringBoot 4와 함께 MySQL 8.0을 사용하고 있습니다.

위의 대답을 시도했지만 저에게 효과가 없었습니다.

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

이것이 도움이된다면 그것을 찬양하는 것을 잊지 마십시오 : D


4

하나 더 제안 된 고대 질문 :

최근에 OS 시간대를 변경 한 경우 (예 :

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime

... db 서비스를 다시 시작할 때까지 MySQL (또는 MariaDB)은 알 수 없습니다.

service mysqld restart

(또는)

service mariadb restart

3

MySql Workbench 를 사용하는 경우 관리자보기를 열고 고급 탭을 선택하여이를 설정할 수 있습니다. 맨 위 섹션은 "현지화"이며 첫 번째 확인란은 "default-time-zone"입니다. 해당 상자를 체크 한 다음 원하는 시간대를 입력하고 서버를 다시 시작하십시오.


2
이 문제는 특정 프로그램이 아니라 MySQL과 관련이 있습니다.
fedorqui 'SO 중지 피해'

3
그런 것을 찾지 못했습니다.
Kzqai 2016 년

1
그런 것은 없습니다
Green

MySQL Workbench 6.3의 경우 : 인스턴스 => 옵션 파일 => 일반 => 국제
paulus

5
[ MySQL Workbench 8.0 업데이트 ] "서버"=> "옵션 파일"을 선택하고 "일반" 에서 "국제" 섹션을 참조하십시오 . 관련 필드와 함께 "기본 시간대"확인란이 있습니다. 따라서 기본 시간대 값을 설정할 수 있습니다 .
informatik01

3

먼저 time_zone이 쿼리 할 수있는 것이 무엇인지 파악하십시오.

SHOW VARIABLES LIKE '%time_zone%'; 

출력은 다음과 유사해야합니다.

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

그런 다음 EST와 같은 대신 CDT와 같은 시간대를 말하고 있음을 확인하려면 다음과 같이 말하여 컴퓨터가 생각하는 시간을 확인할 수 있습니다

SELECT NOW();

만약 당신이 원하는 시간이 아니라면 그것을 바꿀 필요가 있습니다 ... 당신이해야 할 일은 SET time_zone = timezone_name. 그것이 안에 있는지 확인하십시오Continent/City형식 .

호스팅 서비스로 인해 공유 서버에있는 경우 php.ini 파일 또는 .htaccess 파일 변경과 관련된 이러한 답변을 참조하십시오 .


1
나는 mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p E먼저 시도한 다음 SET time_zone = timezone_name잘 작동했습니다.
Barakat Turki

1

위치 시간대를 설정해야합니다. 따라서 아래 프로세스를 따르십시오.
MSQLWorkbench를 열고 다음과 같은 간단한 sql 명령을 작성하십시오.

select now();

또한 URL은 다음과 같습니다.

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";

@LuFFy 이것은 내가 궁금한 것이므로 각 db-connect에 대해 '전역'범위 시간대가 아닌 세션 범위 시간대를 사용하는 경우 시간대를 설정해야합니다. 앱에 다른 시간대의 사용자가있을 수있는 경우 세션 범위를 사용하는 것이 좋습니다.
Valter Ekholm

1

MariaDB 에서 표준 시간대를 설정하려면 50-server.cnf 파일 로 이동해야 합니다.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

그런 다음 mysqld 섹션에 다음 항목을 입력 할 수 있습니다.

default-time-zone='+01:00'

예:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

구성 파일을 통해 변경해야합니다. 그렇지 않으면 재시작 후 MariaDB 서버가 mysql 테이블을 재설정합니다!


1

MySQL 설정 파일 편집

sudo nano /etc/mysql/my.cnf

이것을 아래로 스크롤하여 추가하십시오. 관련 시간대로 변경

[mysqld]
default-time-zone = "+00:00"

서버를 다시 시작하십시오

sudo service mysql restart

0

Windows (IIS)에서 GLOBAL을 설정할 수 있으려면 time_zone = 'Europe / Helsinki'(또는 기타) MySQL time_zone 설명 테이블을 먼저 채워야합니다.

이 링크 https://dev.mysql.com/downloads/timezones.html 에서 다운로드했습니다.

다운로드 한 SQL 쿼리를 실행 한 후 GLOBAL time_zone을 설정하고 SELECT NOW ()에서 발생한 문제를 해결할 수있었습니다. BST 대신 GMT를 반환했습니다.


"유럽 / 스톡홀름"대신 숫자 형식 "+01 : 00"을 사용할 수 있으므로 time_zone 설명 테이블을 다운로드 할 필요가 없습니다.
Valter Ekholm

0

필자의 경우 해결책은 고급 설정의 serverTimezone 매개 변수를 적절한 값 (표준 시간대의 CET)으로 설정하는 것이 었습니다.

IntelliJ를 사용할 때 데이터베이스 모듈을 사용합니다. 데이터베이스에 새 연결을 추가하는 중 및 일반 탭에서 모든 관련 매개 변수를 추가 한 후 "연결 테스트"단추에 오류가있었습니다. 다시 해결책은 고급 탭에서 serverTimezone 매개 변수를 설정하는 것입니다.


0

누구든지 GoDaddy 공유 호스팅을 사용하는 경우 다음 솔루션을 시도해 볼 수 있습니다.

DB 연결을 시작할 때 PDO 객체에서 time_zone 명령을 설정하십시오.

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

여기서 "+05 : 30"은 인도의 TimeZone입니다. 필요에 따라 변경할 수 있습니다.

그 후; 날짜 및 시간과 관련된 모든 MySQL 프로세스는 필수 시간대로 설정됩니다.

출처 : https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.