Bagaimana cara mendapatkan zona waktu MySQL saat ini?


217

Adakah yang tahu jika ada fungsi seperti itu di MySQL?

MEMPERBARUI

Ini tidak menampilkan info yang valid:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

Atau mungkin MySQL sendiri tidak tahu persis apa yang time_zonedigunakan, tidak apa-apa, kita bisa terlibat di PHPsini, selama saya bisa mendapatkan info yang valid tidak seperti SYSTEM...


3
"kita bisa melibatkan PHP di sini" - dan apakah instance php selalu berada di mesin yang sama dengan server MySQL?
VolkerK

Ya, mereka akan berada di mesin yang sama.
user198729

10
Coba @@system_time_zoneseperti yang dinyatakan dalam jawaban saya di bawah ini.
Andrew

Karena pertanyaan diajukan lebih banyak jawaban ditambahkan, mungkin mempertimbangkan kembali jawaban yang diterima?
Timo Huovinen

1
Meskipun server MySQL dan PHP berada di server yang sama, mereka dapat mengambil zona waktu yang berbeda berdasarkan pengaturannya. Dan waktu ini dapat berbeda dari apa yang ditampilkan OS Anda, dan PHP / MySQL ditampilkan.
Bimal Poudel

Jawaban:


227

Dari manual ( bagian 9.6 ):

Nilai saat ini dari zona waktu global dan khusus klien dapat diambil seperti ini:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Sunting Di atas kembali SYSTEMjika MySQL diatur ke budak ke zona waktu sistem, yang kurang bermanfaat. Karena Anda menggunakan PHP, jika jawabannya dari MySQL SYSTEM, Anda dapat menanyakan sistem apa zona waktu yang digunakannya date_default_timezone_get. (Tentu saja, seperti yang ditunjukkan VolkerK, PHP mungkin berjalan di server yang berbeda, tetapi seperti asumsi, dengan asumsi server web dan server DB yang diajaknya diatur ke [jika tidak benar-benar di ] zona waktu yang sama bukanlah lompatan besar .) Tapi berhati-hatilah (seperti halnya MySQL), Anda dapat mengatur zona waktu yang digunakan PHP (date_default_timezone_set), yang berarti dapat melaporkan nilai yang berbeda dari yang digunakan OS. Jika Anda mengendalikan kode PHP, Anda harus tahu apakah Anda melakukan itu dan baik-baik saja.

Tetapi seluruh pertanyaan tentang zona waktu apa yang digunakan server MySQL mungkin bersinggungan, karena bertanya pada server zona waktu mana yang memberitahu Anda sama sekali tidak ada data tentang data dalam database. Baca terus untuk detail:

Diskusi lebih lanjut :

Jika Anda mengendalikan server, tentu saja Anda dapat memastikan bahwa zona waktu adalah jumlah yang diketahui. Jika Anda tidak bisa mengendalikan server, Anda dapat mengatur zona waktu yang digunakan oleh koneksi Anda seperti ini:

set time_zone = '+00:00';

Itu menetapkan zona waktu ke GMT, sehingga operasi lebih lanjut (seperti now()) akan menggunakan GMT.

Namun, perlu diketahui bahwa nilai waktu dan tanggal tidak disimpan dengan informasi zona waktu di MySQL:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

Sehingga mengetahui zona waktu dari server hanya penting dalam hal fungsi yang mendapatkan waktu sekarang, seperti now(), unix_timestamp(), dll .; itu tidak memberi tahu Anda apa pun tentang zona waktu tanggal dalam data database menggunakan. Anda mungkin memilih untuk berasumsi mereka ditulis menggunakan zona waktu server, tetapi asumsi itu mungkin saja cacat. Untuk mengetahui zona waktu dari setiap tanggal atau waktu yang disimpan dalam data, Anda harus memastikan bahwa mereka disimpan dengan informasi zona waktu atau (seperti yang saya lakukan) memastikan mereka selalu dalam GMT.

Mengapa asumsi data ditulis menggunakan zona waktu server cacat? Ya, untuk satu hal, data mungkin ditulis menggunakan koneksi yang menetapkan zona waktu berbeda. Basis data mungkin telah dipindahkan dari satu server ke yang lain, di mana server berada di zona waktu yang berbeda (saya menemukan bahwa ketika saya mewarisi database yang telah pindah dari Texas ke California). Tetapi bahkan jika data ditulis di server, dengan zona waktu saat ini, masih ambigu. Tahun lalu, di Amerika Serikat, Daylight Savings Time dimatikan pukul 02:00 pada tanggal 1 November. Misalkan server saya ada di California menggunakan zona waktu Pasifik dan saya memiliki nilai2009-11-01 01:30:00dalam database. Kapan itu? Apakah itu 1:30 pagi PDT 1 November, atau 1:30 pagi 1 November PST (satu jam kemudian)? Anda sama sekali tidak memiliki cara untuk mengetahui. Moral: Selalu simpan tanggal / waktu dalam GMT (yang tidak melakukan DST) dan konversikan ke zona waktu yang diinginkan jika diperlukan.


5
@ user198729: Ini tidak ada artinya , meskipun hampir tidak membantu seperti yang saya harapkan. Apa artinya: Tanyakan OS, MySQL adalah budak itu.
TJ Crowder

Hanya ingin tahu, mengapa kita harus mengatur zona waktu sendiri dan kemudian mengambilnya? Jenis kekalahan itu tujuannya bukan? Maksud saya, saya ingin menanyakan zona waktu MySQL karena saya tidak tahu jawabannya. Mungkin saya bingung dan ada yang salah. Bisakah seseorang menjelaskan?
Senthil

1
@Senthil DATETIMETipe mySQL tidak mengandung info zona waktu. Oleh karena itu, saya pikir filosofi yang mendasari yang dimaksudkan di sini adalah untuk mySQL menjadi buta zona waktu mungkin - yang berarti bagi pengguna untuk tetap dengan satu zona waktu, baik UTC atau zona waktu server berada, menyimpan segala sesuatu di zona itu, dan lakukan konversi apa pun di tingkat aplikasi atau menggunakan CONVERT_TZ()( dev.mysql.com/doc/refman/5.0/en/… ) Setidaknya, itulah cara saya selalu memahami cara kerjanya, melihat opsi yang jarang disediakan mySQL di bidang ini.
Pekka

Terima kasih tetapi ini masih belum terpecahkan, bagaimana saya mendapatkan info tz dari hasil now()di PHP?
user198729

Saya sangat setuju dengan bagian "tetap pada satu zona waktu saat menyimpan stempel waktu" ..Tapi ini-> "..atau zona waktu server berada di .." bagaimana Anda mengetahui hal itu? Katakanlah Anda menyimpan semua nilai cap waktu sebagai UTC. Tapi server Anda di zona someother dan Anda ingin menampilkan nilai-nilai timestamp sesuai dengan yang zona waktu. Jadi, bagaimana Anda tahu zona waktu server Anda berada? Hanya dengan begitu Anda dapat meneruskan beberapa nilai ke CONVERT_TZ () untuk mengubahnya, bukan?
Senthil

196

Kueri di bawah ini mengembalikan zona waktu sesi saat ini.

select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));

6
Ini benar-benar jawaban yang tepat, karena ini menunjukkan bahwa 'SISTEM' diakui sebagai zona waktu dalam konversi, menjadikannya cukup memadai untuk mengonversi mis. SEKARANG () ke zona waktu mana pun.
nilskp

5
Terima kasih, menggunakan ini saya bisa mendapatkan format yang saya inginkan:select time_format(timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00')),'%H%i');
jordanbtucker

97
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)lebih sederhana.
Jakub Vrána

3
Atau SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);untuk mendapatkan perbedaan dalam hitungan detik.
philfreo

106

Secara sederhana SELECT @@system_time_zone;

Pengembalian PST(atau apa pun yang relevan dengan sistem Anda).

Jika Anda mencoba menentukan zona waktu sesi, Anda dapat menggunakan kueri ini:
SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);

Yang akan mengembalikan zona waktu sesi jika berbeda dari zona waktu sistem.


6
Satu-satunya downside adalah bahwa jika zona waktu berubah karena perubahan waktu Daylight saving itu masih akan melaporkan yang "diingat" pada saat memulai server, lihat bug mysql 9518
Tandai

72

Seperti yang Jakub Vrána (Pencipta atau Admin dan NotORM ) sebutkan di komentar, untuk memilih offset zona waktu saat ini yang TIMEdigunakan:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Ini akan kembali: 02:00:00jika zona waktu Anda adalah +2: 00 untuk tanggal tersebut

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


Atau SELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP);untuk mendapatkan perbedaan dalam hitungan detik.
philfreo

add-on ke @philfreo - perhatikan bahwa parameter harus dibalik dalam TIMESTAMPDIFF dibandingkan dengan TIMEDIFF. Untuk mengambil contoh yang diberikan dalam jawaban ini, jika TIMEDIFF kembali 02:00:00, TIMESTAMPDIFF yang sesuai akan kembali -2jika unitnya JAM, -120jika unit MINUTE, dll. Untuk mendapatkan tanda yang sesuai dengan zona waktu, tukar parameter: SELECT TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP, NOW())akan mengembalikan yang diharapkan 120untuk zona waktu +2: 00. Alasan untuk menentukan menit, apakah ada beberapa zona waktu yang offset 30 atau 45 menit, lihat en.wikipedia.org/wiki/Time_zone
ToolmakerSteve

1
ini adalah jawaban yang jauh lebih baik daripada jawaban yang diterima karena menjawab pertanyaan secara langsung dan memberikan solusi, bukan hanya teori.
supersan

10

Untuk mendapatkan Zona waktu saat ini dari mysql Anda dapat melakukan hal-hal berikut:

 1. SELECT @@system_time_zone;   //from this you can get the system timezone 
 2. SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) //This will give you time zone if system timezone is different from global timezone

Sekarang jika Anda ingin mengubah zona waktu mysql lalu:

 1. SET GLOBAL time_zone = '+00:00'   //this will set mysql timezone in UTC
 2. SET @@session.time_zone = "+00:00";  //by this you can chnage the timezone only for your particular session 

6
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`

Ini akan mengembalikan zona waktu sebagai bilangan bulat (misalnya -6:), menangani waktu positif atau negatif (di sinilah EXTRACTbermain: HOURfungsi sendiri mengembalikan zona waktu negatif sebagai positif).


6

Kepada siapa pun yang datang untuk menemukan zona waktu mysql db.

Dengan kueri ini Anda bisa mendapatkan zona waktu saat ini:

mysql> SELECT @@system_time_zone as tz;
+-------+
|  tz   |
+-------+
|  CET  |
+-------+

4

Perintah yang disebutkan dalam deskripsi mengembalikan "SISTEM" yang mengindikasikan dibutuhkan zona waktu server. Yang tidak berguna untuk permintaan kami.

Permintaan berikut akan membantu untuk memahami zona waktu

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

Kueri di atas akan memberi Anda interval waktu sehubungan dengan Waktu Universal Terkoordinasi (UTC). Jadi Anda dapat dengan mudah menganalisis zona waktu. jika zona waktu basis data adalah IST, outputnya adalah 5:30

UTC_TIMESTAMP

Di MySQL, UTC_TIMESTAMP mengembalikan tanggal dan waktu UTC saat ini sebagai nilai dalam format 'YYYY-MM-DD HH: MM: SS' atau YYYYMMDDHHMMSS.uuuuuuu tergantung pada penggunaan fungsi yaitu dalam konteks string atau numerik.

SEKARANG()

Fungsi SEKARANG (). MySQL NOW () mengembalikan nilai tanggal dan waktu saat ini dalam format 'YYYY-MM-DD HH: MM: SS' atau format YYYYMMDDHHMMSS.uuuuuuu tergantung pada konteks (angka atau string) dari fungsi. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () adalah sinonim dari SEKARANG ().


2

Lihat Dukungan Zona Waktu MySQL Server dan system_time_zonevariabel sistem. Apakah itu membantu?


@ pengguna dapatkah Anda menjabarkan dalam pertanyaan Anda info apa yang sebenarnya Anda cari (zona waktu server? Klien?) dan alat apa yang Anda inginkan? Anda menyebutkan PHP. Bisakah Anda mengakses baris perintah?
Pekka

5
@ Pengguna juga, saya menemukan Anda datang sebagai sedikit dick downvoting jawaban dari orang-orang yang mencoba untuk membantu, dan tidak sepenuhnya salah. Saya tidak keberatan dengan pemungutan suara atau kehilangan poin, tetapi sikap Anda tidak mendorong untuk mencari solusi lebih jauh.
Pekka

3
@ Pengguna seperti yang saya katakan, sikap Anda tidak memotivasi saya untuk mencari jawaban lebih lanjut untuk Anda, terutama mengingat sedikit informasi yang Anda berikan. Maaf.
Pekka

3
@ user198729: Wow, kehilangan sikap. Pekka adalah tipe pria yang sangat membantu orang. Jika sopan santun saja tidak cukup untuk memotivasi Anda, cobalah untuk mementingkan diri sendiri.
TJ Crowder

2
Hanya pikiran saya: Saya tidak akan tersinggung jika pengguna melakukan hal yang sama pada posting saya. Maksudku, tekanan tenggat waktu atau frustrasi memang menambah beberapa sisi kasar di sekitar orang, tapi saya pikir kita harus membiarkannya sampai batas tertentu. Mungkin saya terlalu memaafkan: |
Senthil

1

Kerangka kerja PHP saya gunakan

SET LOCAL time_zone='Whatever'

aktif setelah terhubung, di mana 'Terserah' == date_default_timezone_get ()

Bukan solusi saya, tetapi ini memastikan SYSTEM zona waktu server MySQL selalu sama dengan PHP

Jadi, ya, PHP sangat terlibat dan dapat mempengaruhinya


1

Untuk mendapatkan waktu saat ini sesuai dengan zona waktu Anda, Anda dapat menggunakan yang berikut (dalam kasus saya ini '+5: 30')

pilih DATE_FORMAT (convert_tz (sekarang (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d')


0

Anda hanya perlu me-restart mysqld setelah mengubah zona waktu Sistem ..

Zona waktu Global MySQL membutuhkan zona waktu Sistem. Ketika Anda mengubah atribut sistem seperti itu, Anda hanya perlu me-restart Mysqld.


setelah mengubah zona waktu pada OS, sisipan mysql akan menggunakan zona waktu baru tetapi pilih sekarang (); dan pilih current_timestamp; perintah masih akan menggunakan zona waktu lama. Untuk menyinkronkan semua ini, layanan mysql harus dimulai ulang.
Manoj Kumar G

0

Masukkan catatan boneka ke salah satu basis data Anda yang memiliki timestamp Pilih catatan itu dan dapatkan nilai cap waktu. Hapus catatan itu. Memastikan zona waktu yang digunakan server untuk menulis data dan mengabaikan zona waktu PHP.


0

Anda dapat mencoba yang berikut ini:

select sec_to_time(TIME_TO_SEC( curtime()) + 48000);

Di sini Anda dapat menentukan perbedaan waktu Anda sebagai detik


1
Anda tidak harus menambah dan mengurangi offset. dengan aturan siang hari mengatakan dll itu adalah ladang ranjau
eweb

0

Gunakan LPAD(TIME_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP),’%H:%i’),6,’+')untuk mendapatkan nilai dalam format zona waktu MySQL yang dapat Anda gunakan dengan nyaman CONVERT_TZ(). Perhatikan bahwa offset zona waktu yang Anda dapatkan hanya valid pada saat di mana ekspresi dievaluasi karena offset dapat berubah seiring waktu jika Anda memiliki waktu musim panas. Namun ungkapan itu berguna bersama-sama dengan NOW()menyimpan offset dengan waktu lokal, yang merusak apa yang NOW()dihasilkan. (Dalam zona waktu DST, NOW()melompat mundur satu jam setahun sekali, sehingga memiliki beberapa nilai duplikat untuk poin waktu yang berbeda).


0

Itu mungkin

select timediff(current_time(),utc_time())

Anda tidak akan mendapatkan nilai zona waktu secara langsung dengan cara ini.

@@global.time_zonetidak dapat digunakan karena merupakan variabel, dan mengembalikan nilai 'SYSTEM'.

Jika Anda perlu menggunakan kueri dalam sesi dengan zona waktu yang diubah dengan menggunakan session SET TIME_ZONE =, maka Anda akan mendapatkannya @@session.time_zone. Jika Anda bertanya @@global.time_zone, maka Anda mendapatkannya 'SYSTEM'.

Jika Anda mencoba datediff,, date_subatau timediffdengan now()dan utc_time(), maka Anda mungkin akan mengalami masalah konversi.

Tetapi hal-hal yang disarankan di atas mungkin akan berfungsi setidaknya dengan beberapa versi server. Versi saya adalah 5.5.43-37 dan merupakan solusi yang di-host.


Ini tidak dengan jelas menjawab pertanyaan itu. Mungkin Anda bisa mengeditnya untuk fokus pada pertanyaan yang diajukan.
Mogsdad

-3

Coba gunakan kode berikut:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.