시간대에 대한 MySQL Caculating 오프셋에서
문제
MySQL에 시간대의 오프셋을 계산하는 방법이 있습니까? 예를 들어, 시간대에 현지 시간을 얻으려면 Asia/calcutta
. 내가하고 싶은 것은이 시간대의 오프셋을 계산하고 해당 오프셋을 GMT에 추가하여 현지 시간을 얻는 것입니다.
해결책
UTC의 America/Vancouver와 같은 시간대의 오프셋을 계산하려면 다음과 같이 할 수 있습니다.
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
이것이 작동하려면 먼저 여기에 설명 된대로 시간대 정보를 MySQL에로드해야합니다. http://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html
다른 팁
SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());
서버의 시간대가 PST 인 경우 반환됩니다. -8
.
SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());
MySQL DateTimes와 비교하려면 위의 결과를 UNIX 타임 스탬프에 추가하십시오.
오프셋은 관심있는 시간에 따라 다릅니다. 예를 들어, 현재 UTC에서 1 시간의 오프셋이 있지만 겨울에는 오프셋이 0이됩니다.
판단 MySQL 시간대 지원의 문서 페이지, 당신은 사용하고 싶습니다 convert_tz
기능. UTC를 현지 시간으로 변환하려는 경우 "etc/gmt+0"을 "Time Zone에서", "Asia/Calcutta"를 "to"로 통과하십시오.
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
기부
+--------+
| offset |
+--------+
| 05:30 |
+--------+
나는 몇 시간 만에 임의의 시간대의 오프셋을 원했기 때문에 @colinm과 @kenneth spencer의 답변을 혼합했습니다.
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
-
SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
Kenneth가 지적했듯이 시간대 정보를로드해야합니다. http://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html
그러나 여러 타임 존에 대한 오프셋을 한 번에 찾는 것과 같은 재미있는 일을 할 수 있습니다.
SELECT Name,
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
FROM mysql.time_zone_name
WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
기부:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
오프셋으로 전달할 수 있습니다
http://dev.mysql.com/doc/refman/55.1/en/time-zone-support.html
위의 @Colinm의 답변이 안전한지 궁금합니다. 시계를 한두 번 읽습니까? UTC_TIMESTAMP ()와 이제 ()가 1 초 간격 할 수있는 가능성이 있습니까? 모르겠지만 이것은 그것을 피할 것입니다.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);