Bagaimana cara mengatur zona waktu MySQL?

339

Di satu server, ketika saya menjalankan:

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

Di server lain:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
Oh Tuhan
sumber
Tidak hanya ada perbedaan zona waktu di sini - tetapi penyimpangan waktu yang tidak terlalu signifikan juga: "Bicaralah dengan DBA Anda tentang ntp- dan lihat apa yang tepat untuk Anda!"
colm.anseo
@ colm.anseo Tenang itu mungkin perbedaan antara menjalankan kueri
HosseyNJF
1
@ HoseseyNJF dalam 7 menit? Coffee break di antara perbandingan?
colm.anseo

Jawaban:

525

Saya pikir ini mungkin berguna:

Ada tiga tempat di mana zona waktu mungkin diatur di MySQL:

Di file "my.cnf" di bagian [mysqld]

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

@@ variabel global.time_zone

Untuk melihat nilai apa yang ditetapkan untuk:

SELECT @@global.time_zone;

Untuk menetapkan nilai untuk itu gunakan salah satu:

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

(Menggunakan zona waktu bernama 'Eropa / Helsinki' berarti Anda harus memiliki tabel zona waktu yang dihuni dengan benar.)

Ingatlah bahwa itu +02:00adalah offset. Europe/Berlinadalah zona waktu (yang memiliki dua offset) dan CESTmerupakan waktu jam yang sesuai dengan offset tertentu.

@@ session.time_zone variabel

SELECT @@session.time_zone;

Untuk mengaturnya gunakan salah satu:

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

Keduanya mungkin mengembalikan SISTEM yang berarti bahwa mereka menggunakan zona waktu yang ditetapkan di my.cnf.

Agar nama zona waktu berfungsi, Anda harus mengatur tabel informasi zona waktu Anda perlu diisi: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Saya juga menyebutkan cara mengisi tabel-tabel dalam jawaban ini .

Untuk mendapatkan offset zona waktu saat ini sebagai TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Ini akan kembali 02:00:00 jika zona waktu Anda adalah +2: 00.

Untuk mendapatkan cap waktu UNIX saat ini:

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

Untuk mendapatkan kolom cap waktu sebagai cap waktu UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Untuk mendapatkan kolom waktu UTC sebagai cap waktu UNIX

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

Catatan: Mengubah zona waktu tidak akan mengubah datetime yang disimpan atau stempel waktu , tetapi itu akan menunjukkan datetime yang berbeda untuk kolom stempel waktu yang ada karena mereka disimpan secara internal sebagai stempel waktu UTC dan ditampilkan secara eksternal di zona waktu MySQL saat ini.

Saya membuat lembar contekan di sini: Haruskah MySQL mengatur zona waktunya ke UTC?

Timo Huovinen
sumber
3
+00:00bukan zona waktu, ini adalah offset waktu. Apa yang terjadi dengan DST? Apakah tetap di +0 sepanjang tahun?
mpen
1
@ Mark Saya tidak yakin, dokumen mengatakan bahwa ketika mengatur time_zone="+00:00"Anda mengatur zona waktu menggunakan offset dari UTC, mengingat bahwa nilai yang ditetapkan tidak pernah berubah dan bahwa UTC tidak mengikuti DST, saya dapat mengasumsikan bahwa ia tetap sama sepanjang tahun.
Timo Huovinen
1
@TimoHuovinen Maaf, maksud saya yang +00:00 terlihat seperti offset sehingga agak aneh bahwa MySQL memilih untuk mewakili UTC daripada hanya menggunakan string "UTC" itu sendiri. Terimakasih atas infonya.
mpen
1
Saya menetapkan +00: 00, tetapi saya mendapatkan kesalahan ini: kesalahan: Opsi ditemukan tanpa grup sebelumnya dalam file konfigurasi: /etc/my.cnf
János
5
di Win7, jalur ke file pengaturan mysql adalahC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
83

Bagi siapa pun yang masih memiliki masalah ini:

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

Bekerja untukku. Cukup tambahkan ?serverTimezone=UTCdi bagian akhir.

Noel Murphy
sumber
Jika zona waktu saya adalah UTC + 7, bagaimana saya bisa menentukannya di string koneksi? Saya mencoba menambahkan "? ServerTimezone = UTC + 7" dan tidak berfungsi.
Chiến Nghê
1
Pertanyaannya bukan tentang JDBC, tetapi MySQL itu sendiri.
Luiz
2
@ ChiếnNghê: Anda harus menggunakan Asia/Ho_Chi_Minhalih-alih UTCBTW, pertanyaannya adalah tentang mengubah zona waktu MySQL. Jadi tolong lihat jawaban @Timo. Jika Anda memiliki masalah dengan buruh pelabuhan MySQL, tambahkan lingkungan TZ dan itu akan berfungsi.
Liem Le
2
Ini hanya memberi tahu JDBC apa zona waktu server, itu tidak mengubahnya. Untuk mengatur zona waktu sesi, periksa jawaban yang menggunakanSET time_zone=...
Nikola Mihajlović
Saya mendapatkan kesalahan CDT, tetapi ini memperbaikinya untuk saya.
Akexis
58

Saat Anda dapat mengonfigurasi server zona waktu untuk MySQL atau PHP:

Ingat:

  1. Ubah sistem zona waktu. Contoh untuk Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Mulai ulang server atau Anda dapat me-restart Apache 2 dan MySQL:

    /etc/init.d/mysql restart
jane
sumber
2
Mungkin pendekatan ini mungkin bukan yang benar. Pikirkan tentang situasi memiliki server dengan UTC tetapi aplikasi Anda melayani data ke suatu negara di UTC -0600. Untuk mengatur zona waktu untuk MySQL, bisa jauh lebih baik.
ivanleoncz
1
Terutama jika Anda bekerja di area yang mencakup beberapa zona waktu.
Alexis Wilke
57

Untuk mengaturnya untuk sesi saat ini, lakukan:

SET time_zone = timezonename;
James Skidmore
sumber
14
SELECT @@ session.time_zone;
James Skidmore
1
Saya mencoba memperbaiki beberapa kesalahan pada sistem saya, dan saya perlu mengatur time_zone ke UTC, bukan GMT. Apakah Anda tahu jika saya menetapkan ke '-0: 00' atau '+00: 00' ini adalah anotasi UTC atau anotasi GMT? Saya agak TIDAK menemukan informasi spesifik ini. Bersulang!
rafa.ferreira
@Castanho, saya cukup yakin keduanya akan bekerja dengan baik. Lihatlah penjelasan tentang pertanyaan ini: stackoverflow.com/questions/3466630/…
James Skidmore
Nilai untuk zona waktu bisa sama dengan yang ditetapkan di PHP, seperti SET time_zone = 'America/Boise'. Terima kasih atas jawabannya, James Skidmore!
Adam F
1
@the_nuts ya, SET time_zone = 'UTC';pengaturan hilang selama server restart
Timo Huovinen
48

Cukup jalankan ini di server MySQL Anda:

SET GLOBAL time_zone = '+8:00';

Di mana +8: 00 akan menjadi zona waktu Anda.

Rico Chan
sumber
14
Perhatikan, bahwa ini hanya sementara sampai Anda me-restart Mysql
rubo77
Jarang ada yang memiliki hak superuser saat menghubungkan ke DB. Pengaturan @@session.time_zoneseperti yang dijelaskan dalam jawaban lain adalah rute yang jauh lebih baik.
colm.anseo
16

Ini berfungsi untuk saya untuk lokasi di India:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
sumber
Anda perlu menjalankan ini sebagai kueri di mysql atau menulis di bawah my.conf dengan mengikuti sintaks default-time-zone = '+05: 30'
Swapnil Bijwe
11

Perlu diingat, bahwa 'Negara / Zona' kadang-kadang tidak berfungsi ... Masalah ini bukan OS, versi MySQL, dan perangkat keras - saya sudah bertemu sejak FreeBSD 4 dan Slackware Linux pada tahun 2003 hingga hari ini. MySQL dari versi 3 hingga trunk sumber terbaru. Itu GANJIL, tetapi TIDAK TERJADI. Sebagai contoh:

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#

Dan pernyataan seperti itu seharusnya berfungsi:

SET time_zone='US/Eastern';

Tetapi Anda memiliki masalah ini:

Kode Kesalahan: 1298. Zona waktu tidak dikenal atau salah: 'EUS / Timur'

Lihatlah subfolder di direktori informasi zona Anda, dan lihat nama file ACTUAL untuk symlink, dalam hal ini EST5EDT. Maka cobalah pernyataan ini sebagai gantinya:

SET time_zone='EST5EDT';

Dan itu benar-benar berfungsi sebagaimana mestinya! :) Ingatlah trik ini; Saya belum melihatnya didokumentasikan dalam manual MySQL dan dokumentasi resmi. Tetapi membaca dokumentasi yang sesuai adalah hal yang harus dilakukan: dokumentasi resmi zona waktu MySQL 5.5 - dan jangan lupa memuat data zona waktu ke server Anda begitu saja (jalankan sebagai pengguna root!):

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

Trik nomor satu - itu harus dilakukan persis di bawah pengguna root MySQL. Itu bisa gagal atau menghasilkan hasil yang tidak berfungsi bahkan dari pengguna yang memiliki akses penuh ke database MySQL - saya melihat kesalahan sendiri.

Alexey Vesnin
sumber
Tolong beritahu saya uname -a dan detail lebih lanjut - ada beberapa case yang berfungsi pada desktop dan server Ubuntu.
Alexey Vesnin
7

Ini adalah pertanyaan berumur 10 tahun, tapi bagaimanapun, inilah yang berhasil untuk saya. Saya menggunakan MySQL 8.0 dengan Hibernate 5 dan SpringBoot 4.

Saya sudah mencoba jawaban yang diterima di atas tetapi tidak berhasil untuk saya, yang berhasil bagi saya adalah ini:

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

Jika ini membantu Anda jangan lupa untuk memperbaikinya: D

hamza saber
sumber
4

Pertanyaan kuno dengan satu saran lagi:

Jika Anda baru saja mengubah zona waktu OS, mis. Via:

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

... MySQL (atau MariaDB) tidak akan melihat sampai Anda me-restart layanan db:

service mysqld restart

(atau)

service mariadb restart
inanutshellus
sumber
3

Jika Anda menggunakan MySql Workbench, Anda dapat mengatur ini dengan membuka tampilan administrator dan memilih tab Advanced. Bagian atas adalah "Lokalisasi" dan kotak centang pertama harus "zona waktu default". Centang kotak itu dan kemudian masukkan zona waktu yang Anda inginkan, restart server dan Anda akan baik-baik saja.

Taylor Lafrinere
sumber
2
Masalahnya terkait dengan MySQL, bukan ke program tertentu.
fedorqui 'SO stop harming'
3
Tidak menemukan yang seperti itu.
Kzqai
1
Tidak ada yang seperti itu
Green
Untuk MySQL Workbench 6.3: Instance => Opsi file => Umum => Internasional
paulus
5
[ UPDATE untuk MySQL Workbench 8,0 ] Pilih "Server" => "Options File", dan pada "General" tab lihat di bawah "International" bagian . Akan ada kotak centang "zona waktu default" bersama dengan bidang terkait. Jadi Anda dapat mengatur nilai zona waktu default di sana.
informatik01
3

Pertama-tama untuk mencari tahu time_zone apa yang bisa Anda query

SHOW VARIABLES LIKE '%time_zone%'; 

Output Anda harus serupa seperti berikut

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

Kemudian jika Anda ingin mengonfirmasi bahwa Anda mengatakan beberapa zona waktu seperti CDT, bukan sesuatu seperti EST, Anda dapat memeriksa jam berapa menurutnya mesin Anda berada dengan mengatakan

SELECT NOW();

Jika ini bukan waktu yang Anda inginkan, Anda perlu mengubahnya ... yang perlu Anda lakukan adalah SET time_zone = timezone_name. Pastikan itu salah satu yang ada dalam Continent/Cityformat.

Jika Anda berada di server bersama karena Anda memiliki layanan hosting silakan merujuk ke jawaban ini mengenai mengubah file php.ini atau file .htaccess.

Erik Toor
sumber
1
Saya sudah mencoba mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Edulu dan kemudian SET time_zone = timezone_namebekerja dengan baik.
Barakat Turki
1

Anda harus mengatur zona waktu lokasi Anda. Jadi ikuti proses di bawah ini
Buka MSQLWorkbench Anda, tulis perintah sql sederhana seperti ini;

select now();

Dan juga url Anda bisa seperti ini;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
sumber
@LuFFy inilah yang saya ingin tahu, jadi untuk setiap db-hubungkan zona waktu harus diatur JIKA kita menggunakan zona waktu sesi-lingkup dan bukan zona-lingkup waktu 'global'-lingkup. Baik untuk menggunakan ruang lingkup sesi jika aplikasi dapat memiliki pengguna di zona waktu yang berbeda, bukan?
Valter Ekholm
1

Untuk mengatur zona waktu standar di MariaDB Anda harus pergi ke file 50-server.cnf .

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

Kemudian Anda dapat memasukkan entri berikut di bagian mysqld.

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

Contoh:

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

Perubahan harus dilakukan melalui file konfigurasi, jika tidak server MariaDB akan mengatur ulang tabel mysql setelah restart!

Lukas Kuntze
sumber
1

Edit file konfigurasi MySQL

sudo nano /etc/mysql/my.cnf

Gulir dan tambahkan ini ke bawah. Ubah ke zona waktu yang relevan

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

Mulai ulang server

sudo service mysql restart
Ivan_ug
sumber
0

Pada Windows (IIS) agar dapat MENYETEL GLOBAL time_zone = 'Europe / Helsinki' (atau apa pun) tabel deskripsi time_zone MySQL harus diisi terlebih dahulu.

Saya mengunduh ini dari tautan ini https://dev.mysql.com/downloads/timezones.html

Setelah menjalankan kueri SQL yang diunduh, saya dapat mengatur time_zone GLOBAL dan menyelesaikan masalah yang saya miliki di mana SELECT NOW NOW (); mengembalikan GMT daripada BST.

Stewart Kirkpatrick
sumber
Saya dapat menggunakan format angka "+01: 00" alih-alih "Eropa / Stockholm" jadi saya tidak perlu melakukan dowload tabel deskripsi time_zone, saya pikir.
Valter Ekholm
0

Dalam kasus saya, solusinya adalah mengatur parameter serverTimezone di pengaturan Lanjut ke nilai yang sesuai (CET untuk zona waktu saya).

Ketika saya menggunakan IntelliJ, saya menggunakan modul Database-nya. Saat menambahkan koneksi baru ke database dan setelah menambahkan semua parameter yang relevan di tab General, ada kesalahan pada tombol "Uji Koneksi". Sekali lagi, solusinya adalah mengatur parameter serverTimezone di tab Advanced.

ognjenkl
sumber
0

Jika ada yang menggunakan GoDaddy Shared Hosting, Anda dapat mencoba solusi berikut, bekerja untuk saya.

Saat memulai koneksi DB, atur perintah time_zone di objek PDO saya mis:

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

Di mana "+05: 30" adalah TimeZone of India. Anda dapat mengubahnya sesuai kebutuhan Anda.

Setelah itu; semua proses MySQL yang terkait dengan Tanggal dan Waktu diatur dengan zona waktu yang diperlukan.

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

Ashish Pandey
sumber