2009-04-30 40 views
13

Có cách nào trong mysql để tính toán độ lệch cho bất kỳ múi giờ nào không. Ví dụ để có được thời gian địa phương trong múi giờ 'Châu Á/calcutta', những gì tôi muốn làm là tính toán bù đắp cho múi giờ này và thêm bù đắp cho GMT để có được thời gian địa phương.Trong tính toán bù trừ MySQL cho một múi giờ

Trả lời

11

Nếu bạn muốn tính toán bù đắp của một múi giờ như Châu Mỹ/Vancouver từ UTC, bạn có thể làm điều đó như sau:

SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver')))/3600 as offset; 

Để làm việc này trước tiên bạn cần tải thông tin múi giờ vào mysql như được nêu tại đây: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

-1
DATEDIFF(NOW(), UTC_TIMESTAMP()) 
+1

DATEDIFF trả về sự khác biệt trong ngày * * không giờ hoặc phút .. – ColinM

5

Khoản chênh lệch sẽ tùy thuộc vào thời gian bạn quan tâm - ví dụ: tôi hiện có chênh lệch một giờ từ UTC, nhưng vào mùa đông, chênh lệch của tôi sẽ bằng 0.

Đánh giá theo số docs page on MySQL time zone support, bạn muốn sử dụng chức năng convert_tz. Nếu bạn đang cố gắng chuyển đổi UTC thành giờ địa phương, hãy chuyển "Etc/GMT + 0" làm múi giờ "từ" và "Châu Á/Calcutta" làm "thành".

-1
SET time_zone = '-07:00'; 

Bạn chỉ có thể vượt qua trong một bù đắp

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

+0

Điều này không hoạt động cũng như suy nghĩ .... –

+0

Không bao giờ sử dụng bù đắp để đặt múi giờ! Luôn sử dụng tên, như "Châu Âu/Prague". Nếu không, bạn sẽ rất ngạc nhiên khi DST xảy ra. –

7

SELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());

Nếu múi giờ của máy chủ là PST này sẽ trở lại -8.

SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());

Thêm kết quả trên cho bất kỳ dấu thời gian unix nếu bạn muốn so sánh nó với DateTimes MySQL.

1

tôi lẫn lộn câu trả lời @ColinM và @Kenneth Spencer vì tôi muốn bù đắp của một múi giờ tùy ý trong giờ:

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) 

Như Kenneth chỉ ra bạn sẽ cần phải tải thông tin múi giờ: http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html

Nhưng sau đó bạn có thể làm những điều thú vị như tìm bù đắp cho nhiều múi giờ cùng một lúc:

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')) 

Giving:

+-------------------+--------+ 
| Name    | Offset | 
+-------------------+--------+ 
| America/Denver |  -6 | 
| America/Vancouver |  -7 | 
| Etc/UTC   |  0 | 
+-------------------+--------+ 
0

Tôi tự hỏi, nếu câu trả lời @ ColinM của trên là an toàn. Nó có đọc đồng hồ một hoặc hai lần không? Có khả năng UTC_TIMESTAMP() và NOW() có thể cách nhau một giây không? Tôi không biết nhưng điều này sẽ tránh được điều đó.

SET @now = now(); 
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00'); 
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now); 
+0

đây là một nửa câu trả lời nửa câu hỏi – Drew

1
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset; 

Giving

+--------+ 
| offset | 
+--------+ 
| 05:30 | 
+--------+ 
+0

Thông thường, bạn nên tìm hiểu mã trong câu trả lời của mình. Nói về cách nó hoạt động hoặc chính xác những gì bạn đang làm. Điều này giúp các nhà phát triển mới hiểu chính xác những gì đang diễn ra. –

Các vấn đề liên quan