Làm cách nào để đặt múi giờ của MySQL?


339

Trên một máy chủ, khi tôi chạy:

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

Trên máy chủ khác:

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

Không chỉ có sự khác biệt về múi giờ ở đây - mà còn là thời gian trôi không đáng kể: "Hãy nói với DBA của bạn về ntp- và xem điều gì phù hợp với bạn!"
colm.anseo

@ colm.anseo Bình tĩnh lại có lẽ là sự khác biệt giữa việc chạy các truy vấn
HosseyNJF

1
@HosseyNJF bằng 7 phút? Cà phê nghỉ giữa so sánh?
colm.anseo

Câu trả lời:


524

Tôi nghĩ rằng điều này có thể hữu ích:

Có ba nơi mà múi giờ có thể được đặt trong MySQL:

Trong tệp "my.cnf" trong phần [mysqld]

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

@@ biến toàn cầu.time_zone

Để xem giá trị nào chúng được đặt thành:

SELECT @@global.time_zone;

Để đặt giá trị cho nó, hãy sử dụng một trong hai:

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

(Sử dụng các múi giờ được đặt tên như 'Châu Âu / Helsinki' có nghĩa là bạn phải có bảng múi giờ được điền đúng.)

Hãy nhớ rằng đó +02:00là một sự bù đắp. Europe/Berlinlà múi giờ (có hai độ lệch) và CESTlà thời gian đồng hồ tương ứng với độ lệch cụ thể.

@@ session.time_zone

SELECT @@session.time_zone;

Để thiết lập, sử dụng một trong hai:

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

Cả hai có thể trả về HỆ THỐNG có nghĩa là họ sử dụng múi giờ được đặt trong my.cnf.

Để tên múi giờ hoạt động, bạn phải thiết lập các bảng thông tin múi giờ của mình cần được điền: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Tôi cũng đề cập đến cách điền vào các bảng trong câu trả lời này .

Để có được độ lệch múi giờ hiện tại như TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Nó sẽ trả về 02:00:00 nếu múi giờ của bạn là +2: 00.

Để lấy dấu thời gian UNIX hiện tại:

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

Để lấy cột dấu thời gian dưới dạng dấu thời gian UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Để lấy cột thời gian UTC dưới dạng dấu thời gian UNIX

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

Lưu ý: Thay đổi múi giờ sẽ không thay đổi thời gian được lưu trữ hoặc dấu thời gian , nhưng nó sẽ hiển thị thời gian khác nhau cho các cột dấu thời gian hiện tại khi chúng được lưu trữ bên trong dưới dạng dấu thời gian UTC và hiển thị bên ngoài trong múi giờ MySQL hiện tại.

Tôi đã tạo ra một chiếc áo choàng ở đây: MySQL có nên đặt múi giờ của nó thành UTC không?


3
+00:00không phải là múi giờ, nó là thời gian bù. Điều gì xảy ra liên quan đến DST? Nó có ở mức +0 quanh năm không?
mở

1
@Mark Tôi không chắc chắn, các tài liệu nói rằng khi cài đặt time_zone="+00:00"bạn đang đặt múi giờ bằng cách sử dụng bù từ UTC, xem xét rằng giá trị cài đặt không bao giờ thay đổi và UTC không tuân theo DST Tôi có thể cho rằng nó vẫn giữ nguyên quanh năm.
Timo Huovinen

1
@TimoHuovinen Xin lỗi, ý tôi là +00:00 trông giống như một phần bù nên thật lạ khi MySQL chọn nó để đại diện cho UTC thay vì chỉ sử dụng chuỗi "UTC". Cảm ơn bạn về thông tin.
mở cửa

1
Tôi đã đặt EST: 00, nhưng tôi gặp lỗi này: error: Đã tìm thấy tùy chọn mà không có nhóm trước trong tệp cấu hình: /etc/my.cnf
János

5
trong Win7, đường dẫn đến tệp cài đặt mysql làC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca

82

Đối với bất cứ ai vẫn có vấn đề này:

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

Đã làm cho tôi. Chỉ cần thêm ?serverTimezone=UTCvào cuối.


Nếu múi giờ của tôi là UTC + 7, làm thế nào tôi có thể chỉ định điều đó trong chuỗi kết nối? Tôi đã thử thêm "? ServerTimezone = UTC + 7" và nó không hoạt động.
Chiến Nghê

1
Câu hỏi không phải là về JDBC, mà là chính MySQL.
Luiz

2
@ ChiếnNghê: Bạn nên sử dụng Asia/Ho_Chi_Minhthay vì UTCBTW, câu hỏi là về việc thay đổi múi giờ của MySQL. Vì vậy, hãy nhìn vào câu trả lời @Timo. Nếu bạn gặp sự cố với docker MySQL, hãy thêm môi trường TZ và nó sẽ hoạt động.
Liêm Lê

2
Điều này chỉ thông báo cho JDBC những gì múi giờ của máy chủ, nó không thay đổi nó. Để đặt múi giờ phiên, hãy kiểm tra câu trả lời sử dụngSET time_zone=...
Nikola Mihajlović

Tôi đã nhận được một lỗi CDT, nhưng điều này đã sửa nó cho tôi.
Akexis

58

Khi bạn có thể định cấu hình máy chủ múi giờ cho MySQL hoặc PHP:

Nhớ lại:

  1. Thay đổi hệ thống múi giờ. Ví dụ cho Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Khởi động lại máy chủ hoặc bạn có thể khởi động lại Apache 2 và MySQL:

    /etc/init.d/mysql restart

2
Có lẽ cách tiếp cận này có thể không đúng. Hãy suy nghĩ về tình huống có máy chủ với UTC nhưng ứng dụng của bạn đang phục vụ dữ liệu cho một quốc gia trên UTC -0600. Để điều chỉnh múi giờ cho MySQL, có thể tốt hơn nhiều.
ivanleoncz

1
Đặc biệt nếu bạn làm việc trong một khu vực bao gồm nhiều múi giờ.
Alexis Wilke

57

Để đặt nó cho phiên hiện tại, hãy làm:

SET time_zone = timezonename;

14
CHỌN @@ session.time_zone;
James Skidmore

1
Tôi đang cố gắng sửa một số lỗi trên hệ thống của mình và tôi cần đặt time_zone của mình thành UTC, không phải GMT. Bạn có biết nếu tôi đặt thành '-0: 00' hoặc 'EST: 00' thì đây là chú thích UTC hoặc chú thích GMT không? Tôi không tìm thấy thông tin cụ thể này. Chúc mừng!
rafa.ferreira

@Castanho, tôi khá chắc chắn một trong hai sẽ hoạt động tốt. Kiểm tra lời giải thích cho câu hỏi này: stackoverflow.com/questions
43266630 / Khăn

Giá trị cho múi giờ có thể giống với giá trị được đặt trong PHP, chẳng hạn như SET time_zone = 'America/Boise'. Cảm ơn câu trả lời, James Skidmore!
Adam F

1
@the_nuts có, SET time_zone = 'UTC';cài đặt bị mất trong quá trình khởi động lại máy chủ
Timo Huovinen

48

Chỉ cần chạy cái này trên máy chủ MySQL của bạn:

SET GLOBAL time_zone = '+8:00';

Trong đó +8: 00 sẽ là múi giờ của bạn.


14
Lưu ý rằng điều này chỉ là tạm thời cho đến khi bạn khởi động lại Mysql
rubo77

Hiếm ai có đặc quyền siêu người dùng khi kết nối với DB. Thiết lập @@session.time_zonenhư được mô tả trong các câu trả lời khác là một lộ trình tốt hơn nhiều.
colm.anseo

16

Công việc này đối với tôi cho một địa điểm ở Ấn Độ:

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

bạn cần chạy nó dưới dạng truy vấn trên mysql hoặc viết theo my.conf với cú pháp default-time-zone = '+05: 30'
Swapnil Bijwe

11

Bạn có thể chỉ định múi giờ mặc định của máy chủ khi bạn khởi động nó, xem http://dev.mysql.com/doc/refman/5.1/en/server-options.html và cụ thể là --default-time-zone=timezonetùy chọn. Bạn có thể kiểm tra múi giờ toàn cầu và phiên với

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

đặt một hoặc cả hai với SETcâu lệnh, & c; xem http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html để biết thêm chi tiết.


11

Hãy nhớ rằng, 'Quốc gia / Vùng' đôi khi không hoạt động ... Vấn đề này không phải là hệ điều hành, phiên bản MySQL và phụ thuộc phần cứng - Tôi đã gặp nó kể từ FreeBSD 4 và Slackware Linux vào năm 2003 cho đến ngày hôm nay. MySQL từ phiên bản 3 cho đến trung kế nguồn mới nhất. Đó là ODD, nhưng nó xảy ra. Ví dụ:

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#

Và một tuyên bố như thế được cho là có tác dụng:

SET time_zone='US/Eastern';

Nhưng bạn có vấn đề này:

Mã lỗi: 1298. Múi giờ không xác định hoặc không chính xác: 'EUS / Miền Đông'

Hãy xem thư mục con trong thư mục thông tin vùng của bạn và xem tên tệp THỰC TẾ cho symlink, trong trường hợp này là EST5EDT. Sau đó, hãy thử tuyên bố này:

SET time_zone='EST5EDT';

Và nó thực sự hoạt động như mong muốn! :) Hãy ghi nhớ mẹo này; Tôi chưa thấy nó được ghi lại trong tài liệu hướng dẫn sử dụng MySQL và tài liệu chính thức. Nhưng đọc tài liệu tương ứng là việc cần làm: tài liệu chính thức về múi giờ của MySQL 5.5 - và đừng quên tải dữ liệu múi giờ vào máy chủ của bạn như thế (chạy với tư cách người dùng root!):

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

Thủ thuật số một - nó phải được thực hiện chính xác dưới người dùng root MySQL. Nó có thể thất bại hoặc tạo ra kết quả không hoạt động ngay cả từ người dùng có toàn quyền truy cập vào cơ sở dữ liệu MySQL - Bản thân tôi đã thấy sự cố.


Vui lòng cho tôi biết uname của bạn -a và thông tin chi tiết - có một số trường hợp hoạt động trên máy tính để bàn và máy chủ Ubuntu.
Alexey Vesnin


7

Đây là một câu hỏi 10 năm tuổi, nhưng dù sao đây là những gì làm việc cho tôi. Tôi đang sử dụng MySQL 8.0 với Hibernate 5 và SpringBoot 4.

Tôi đã thử câu trả lời được chấp nhận ở trên nhưng không hiệu quả với tôi, điều làm việc cho tôi là:

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

Nếu điều này giúp bạn đừng quên nâng cấp nó: D


4

Câu hỏi cổ xưa với một gợi ý nữa:

Nếu gần đây bạn đã thay đổi múi giờ của HĐH, ví dụ: qua:

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

... MySQL (hoặc MariaDB) sẽ không thông báo cho đến khi bạn khởi động lại dịch vụ db:

service mysqld restart

(hoặc là)

service mariadb restart

3

Nếu bạn đang sử dụng MySql Workbench, bạn có thể thiết lập điều này bằng cách mở giao diện quản trị viên và chọn tab Nâng cao. Phần trên cùng là "Bản địa hóa" và hộp kiểm đầu tiên phải là "múi giờ mặc định". Chọn hộp đó và sau đó nhập múi giờ mong muốn của bạn, khởi động lại máy chủ và bạn sẽ thấy ổn.


2
Vấn đề liên quan đến MySQL, không liên quan đến một chương trình cụ thể.
fedorqui 'SO ngừng làm hại'

3
Không tìm thấy gì như thế.
Kzqai

1
Không có gì như vậy
Green

Đối với MySQL Workbench 6.3: Instance => Tệp tùy chọn => Chung => Quốc tế
paulus

5
[ CẬP NHẬT cho MySQL Workbench 8.0 ] Chọn "Server" => "Tùy chọn File", và trên "General" tab xem dưới đây là "quốc tế" phần . Sẽ có hộp kiểm "múi giờ mặc định" cùng với trường liên quan. Vì vậy, bạn có thể đặt giá trị múi giờ mặc định ở đó.
informatik01

3

Đầu tiên để tìm ra time_zone là gì bạn có thể truy vấn

SHOW VARIABLES LIKE '%time_zone%'; 

Đầu ra của bạn phải giống như sau

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

Sau đó, nếu bạn muốn xác nhận rằng bạn đang nói một số múi giờ như CDT thay vì một cái gì đó như EST, bạn có thể kiểm tra xem máy của bạn đang ở thời gian nào bằng cách nói

SELECT NOW();

Nếu đây không phải là lúc bạn muốn thay đổi ... tất cả những gì bạn cần làm là SET time_zone = timezone_name. Hãy chắc chắn rằng đó là một trong những Continent/Cityđịnh dạng.

Nếu bạn đang sử dụng máy chủ dùng chung vì bạn có dịch vụ lưu trữ, vui lòng tham khảo các câu trả lời này liên quan đến việc thay đổi tệp php.ini hoặc tệp .htaccess.


1
Tôi đã thử mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eđầu tiên và sau đó SET time_zone = timezone_namelàm việc tốt.
Barakat Turki

1

Bạn phải thiết lập múi giờ vị trí của bạn. Vì vậy, theo quy trình dưới đây
Mở MSQLWorkbench của bạn viết một lệnh sql đơn giản như thế này;

select now();

Và cũng url của bạn có thể như thế này;

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

@LuFFy đây là điều tôi băn khoăn, vì vậy với mỗi kết nối db, múi giờ phải được đặt NẾU chúng ta đang sử dụng múi giờ phạm vi phiên chứ không phải múi giờ phạm vi 'toàn cầu. Thật tốt khi sử dụng phạm vi phiên nếu ứng dụng có thể có người dùng ở các múi giờ khác nhau, phải không?
Valter Ekholm

1

Để đặt múi giờ tiêu chuẩn tại MariaDB, bạn phải truy cập tệp 50-server.cnf .

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

Sau đó, bạn có thể nhập các mục sau trong phần mysqld.

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

Thí dụ:

#
# 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.

Thay đổi phải được thực hiện thông qua tệp cấu hình, nếu không, máy chủ MariaDB sẽ đặt lại các bảng mysql sau khi khởi động lại!



0

Trên Windows (IIS) để có thể THIẾT LẬP GLOBAL time_zone = 'Châu Âu / Helsinki' (hoặc bất cứ điều gì), các bảng mô tả time_zone của MySQL cần được đặt trước tiên.

Tôi đã tải xuống những thứ này từ liên kết này https://dev.mysql.com/doads/timezones.html

Sau khi chạy truy vấn SQL đã tải xuống, tôi có thể đặt GLOBAL time_zone và giải quyết vấn đề tôi gặp ở nơi CHỌN NGAY (); đã trở lại GMT chứ không phải BST.


Tôi có thể sử dụng định dạng số "01: 00" thay vì "Châu Âu / Stockholm" vì vậy tôi không cần phải bàn mô tả dowload TIME_ZONE, tôi nghĩ.
Valter Ekholm

0

Trong trường hợp của tôi, giải pháp là tham số serverTimezone bộ trong Advanced settings để một giá trị thích hợp (CET cho múi giờ của tôi).

Như tôi đã sử dụng IntelliJ, tôi sử dụng mô-đun cơ sở dữ liệu của nó. Trong khi thêm một kết nối mới vào cơ sở dữ liệu và sau khi thêm tất cả các thông số liên quan trong tab General, đã có lỗi khi vào nút "Test Connection". Một lần nữa, giải pháp là đặt tham số serverTimezone trong tab Nâng cao.


0

Nếu bất cứ ai đang sử dụng GoDaddy Shared Hosting, bạn có thể thử giải pháp sau, làm việc cho tôi.

Khi bắt đầu kết nối DB, hãy đặt lệnh time_zone trong đối tượng PDO của tôi, vd:

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

Trong đó "+05: 30" là TimeZone của Ấn Độ. Bạn có thể thay đổi nó theo nhu cầu của bạn.

Sau đó; tất cả các quy trình MySQL liên quan đến Ngày và Giờ được đặt với múi giờ bắt buộc.

Nguồn: https://in.godaddy.com/community/cPanel-hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.