/server/191331/should-servers-have-their-timezone-set-to-gmt-utc의 후속 질문
MySQL 시간대를 UTC로 설정해야합니까 아니면 서버 또는 PHP가 설정된 시간대와 동일하게 설정해야합니까? (UTC가 아닌 경우)
장단점은 무엇입니까?
/server/191331/should-servers-have-their-timezone-set-to-gmt-utc의 후속 질문
MySQL 시간대를 UTC로 설정해야합니까 아니면 서버 또는 PHP가 설정된 시간대와 동일하게 설정해야합니까? (UTC가 아닌 경우)
장단점은 무엇입니까?
답변:
현재 시간대에 맞게 시간을 설정하고 저장 한 날짜 / 시간 열의 시간대를 알고 일광 절약 시간의 문제를 알고있는 한 서버의 시간대는 중요하지 않습니다.
반면에 작업하는 서버의 시간대를 제어 할 수 있으면 모든 것을 내부적으로 UTC로 설정하고 시간대와 DST에 대해 걱정할 필요가 없습니다.
다음은 시간대를 자신과 다른 사람을위한 치트 시트의 형태로 사용하는 방법에 대해 수집 한 메모입니다.이 시간대는 사람이 서버에 대해 어떤 시간대를 선택할지, 날짜와 시간을 어떻게 저장할지에 영향을 줄 수 있습니다.
노트:
GMT는 초를 혼동하므로 UTC가 발명되었습니다.
경고! 다른 지역 시간대는 일광 절약 시간 제로 인해 동일한 날짜 시간 값을 생성 할 수 있습니다
내부적으로 MySQL 타임 스탬프 열 은 UTC 로 저장 되지만 날짜를 선택하면 MySQL이 자동으로 현재 세션 시간대로 변환합니다.
타임 스탬프에 날짜를 저장하면 MySQL은 날짜가 현재 세션 시간대에 있다고 가정하고 저장을 위해 UTC로 변환합니다.
현재 MySQL 세션의 시간대에 관계없이
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
서버 또는 글로벌 또는 현재 세션 시간대를 UTC로 설정 한 다음 타임 스탬프를 다음과 같이 선택할 수도 있습니다.
SELECT `timestamp_field` FROM `table_name`
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');
결과 예 : 2015-03-24 17:02:41
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
SELECT @@system_time_zone;
모스크바 시간에 대해 "MSK"또는 "+04 : 00"을 반환합니다. 예를 들어, 숫자 오프셋으로 설정하면 일광 절약 시간이 조정되지 않는 MySQL 버그가 있거나있었습니다
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
시간대가 +2 : 00이면 02:00:00을 반환합니다.
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`
SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
참고 : 시간대는 2 가지 형식으로 설정할 수 있습니다.
명명 된 표준 시간대는 mysql 데이터베이스의 표준 시간대 정보 테이블이 생성되고 채워진 경우에만 사용할 수 있습니다.
default_time_zone='+00:00'
또는
timezone='UTC'
그들이 어떤 값으로 설정되어 있는지 확인하려면
SELECT @@global.time_zone;
값을 설정하려면 다음 중 하나를 사용하십시오.
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
SELECT @@session.time_zone;
설정하려면 다음 중 하나를 사용하십시오.
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
"@@ global.time_zone 변수"및 "@@ session.time_zone 변수"는 "SYSTEM"을 반환 할 수 있습니다. 즉 "my.cnf"에 설정된 시간대를 사용합니다.
시간대 이름이 작동하려면 (기본 시간대의 경우에도) 시간대 정보 테이블을 채워야합니다 ( http://dev.mysql.com/doc/refman/5.1/en/time-zone-support). html
참고 : NULL을 반환 하므로이 작업을 수행 할 수 없습니다.
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
들어 CONVERT_TZ
작업에, 당신은 시간대 테이블이 채워해야
SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;
비어있는 경우이 명령을 실행하여 채우십시오.
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
이 명령 에서 " 행 1의 열 '약어'에 대한 데이터가 너무 깁니다 "오류 가 발생하면 시간대 약어의 끝에 NULL 문자가 추가되어 발생할 수 있습니다.
이 문제를 해결하는 수정
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
(서버의 dst 규칙이 최신 상태인지 확인하십시오 zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )
SELECT
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC
CONVERT_TZ
또한 위 표의 규칙과 사용 날짜에 따라 필요한 DST 변경 사항이 적용됩니다.
참고 : docs
에 따르면 time_zone에 설정 한 값은 변경되지 않습니다. 예를 들어 "+01 : 00"으로 설정하면 time_zone은 UTC에서 오프셋으로 설정되어 DST를 따르지 않습니다. 일년 내내 동일하게 유지됩니다.
명명 된 시간대 만 일광 절약 시간제 시간 동안 변경됩니다.
같은 약어 CET
는 항상 겨울철이며 CEST
여름철이며 +01 : 00은 항상 UTC
시간 + 1 시간이며 둘 다 DST로 변경되지 않습니다.
system
(MySQL은 그것을 결정하지 않는 한) 시간대는 MySQL의가 설치되어있는 호스트 시스템의 시간대 될 것입니다
DST 작업에 대한 자세한 내용은 여기를 참조하십시오.
관련 질문 :
출처 :
table
설정 modified
= '2016년 7월 7일 8시 10분 00 : 00'
UNIX_TIMESTAMP(NOW());
모든 용도에 영향을 미칩니다 CONVERT_TZ()
. UTC 날짜 시간을 UNIX 타임 스탬프로 안정적으로 변환하려면 기본적으로 세션 time_zone을 먼저 설정해야합니다.
PHP와 MySQL에는 자체 기본 시간대 구성이 있습니다. 데이터베이스와 웹 애플리케이션간에 시간을 동기화해야합니다. 그렇지 않으면 일부 문제가 발생할 수 있습니다.
이 튜토리얼을 읽으십시오 : PHP와 MySQL 시간대를 동기화하는 방법
date_default_timezone_set("America/Los_Angeles");
와 mysql_query("SET time_zone='" . date('P', time()) . "'");
매우 우아하게 일했다!