MySQL'in saat dilimini nasıl ayarlarım?


339

Bir sunucuda, çalıştırdığımda:

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

Başka bir sunucuda:

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

Burada sadece bir saat dilimi farkı yok - aynı zamanda önemsiz olmayan bir zaman kayması da var: "DBA'nız hakkında konuşun ntp- ve sizin için neyin doğru olduğunu görün!"
colm.anseo

@ colm.anseo Sakin ol muhtemelen sorguları çalıştırmak arasındaki fark
HosseyNJF

1
@HosseyNJF 7 dakika? Karşılaştırmalar arasında kahve molası?
colm.anseo

Yanıtlar:


525

Bunun yararlı olabileceğini düşündüm:

MySQL'de saat diliminin ayarlanabileceği üç yer vardır:

[Mysqld] bölümündeki "my.cnf" dosyasında

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

@@ global.time_zone değişkeni

Hangi değere ayarlandıklarını görmek için:

SELECT @@global.time_zone;

Bunun için bir değer ayarlamak için birini kullanın:

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

('Europe / Helsinki' gibi adlandırılmış saat dilimlerini kullanmak, saat dilimi tablosunun doğru şekilde doldurulması gerektiği anlamına gelir.)

Bunun +02:00bir mahsup olduğunu unutmayın . Europe/Berlin(iki ofseti olan) CESTbir saat dilimidir ve belirli bir ofsete karşılık gelen bir saattir.

@@ session.time_zone değişkeni

SELECT @@session.time_zone;

Ayarlamak için birini kullanın:

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

Her ikisi de SYSTEM'i döndürebilir, bu da my.cnf dosyasında ayarlanan saat dilimini kullandıkları anlamına gelir.

Saat dilimi adlarının çalışması için saat dilimi bilgi tablolarınızın doldurulması gerekir: http://dev.mysql.com/doc/refman/5.1/tr/time-zone-support.html . Bu cevapta bu tabloları nasıl dolduracağımı da anlatacağım .

Geçerli saat dilimi farkını TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Saat diliminiz +2: 00 ise 02:00:00 döndürecektir.

Geçerli UNIX zaman damgasını almak için:

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

Zaman damgası sütununu UNIX zaman damgası olarak almak için

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

UTC tarih / saat sütununu UNIX zaman damgası olarak almak için

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

Not: Saat diliminin değiştirilmesi, depolanan tarih saatini veya zaman damgasını değiştirmez , ancak mevcut zaman damgası sütunları için dahili olarak UTC zaman damgaları olarak depolandıkları ve geçerli MySQL saat diliminde harici olarak görüntülendiğinden farklı bir tarih saati gösterir.

Burada bir hile sayfası yaptım: MySQL'in saat dilimi UTC olarak ayarlanmış mı?


3
+00:00bir saat dilimi değil, bir zaman farkı. DST ile ilgili ne olur? Yıl boyunca +0'da mı kalıyor?
mpen

1
Emin değilim, @ Mark docs ayarlarken söylemek time_zone="+00:00"Ayarladığınız zaman dilimini , bir UTC offset kullanarak ayarlanan değeri hiç değişmez düşünüyor ve bu UTC DST Ben tüm yıl boyunca aynı kalır varsayabiliriz takip etmez.
Timo Huovinen

1
@TimoHuovinen Üzgünüm, bu bir ofset gibi +00:00 görünüyor yani MySQL sadece "UTC" dizesini kullanmak yerine UTC temsil etmek için seçti garip. Bilgi için teşekkürler.
mpen

1
+00: 00 ayarladım, ancak şu hatayı alıyorum: hata: Yapılandırma dosyasında önceki grup olmadan seçenek bulundu: /etc/my.cnf
János

5
Win7, mysql ayarları dosyasının yoluC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca

83

Hala bu sorunu yaşayan herkes için:

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

Benim için çalıştı. ?serverTimezone=UTCSonuna ekleyin .


Saat dilimim UTC + 7 ise, bunu bağlantı dizesinde nasıl belirleyebilirim? "? ServerTimezone = UTC + 7" eklemeyi denedim ve çalışmıyor.
Chiến Nghê

1
Soru JDBC değil, MySQL'in kendisiyle ilgili.
Luiz

2
@ ChiếnNghê: BTW Asia/Ho_Chi_Minhyerine kullanmalısınız UTC, soru MySQL saat dilimini değiştirmekle ilgilidir. Lütfen @Timo cevabına bakın. MySQL docker ile sorun yaşıyorsanız, TZ ortamı ekleyin ve çalışmalıdır.
Liem Le

2
Bu sadece bilgilendirir sunucu zaman dilimi ne JDBC, bu değil değiştirin. Oturum saat dilimini ayarlamak için, hangi cevapların kullanıldığını kontrol edinSET time_zone=...
Nikola Mihajlović

Bir CDT hatası alıyordum, ama bu benim için düzeltildi.
Akexis

58

MySQL veya PHP için saat dilimi sunucusunu yapılandırabiliyorsanız:

Hatırlamak:

  1. Saat dilimi sistemini değiştirin. Ubuntu örneği:

    $ sudo dpkg-reconfigure tzdata
  2. Sunucuyu yeniden başlatın veya Apache 2 ve MySQL'i yeniden başlatabilirsiniz:

    /etc/init.d/mysql restart

2
Belki de bu yaklaşım doğru olmayabilir. UTC'ye sahip bir sunucuya sahip olma durumunu düşünün, ancak uygulamanız UTC -0600'de bir ülkeye veri sunuyor. MySQL için saat dilimini ayarlamak çok daha iyi olabilir.
ivanleoncz

1
Özellikle birden fazla zaman dilimini kapsayan bir alanda çalışıyorsanız.
Alexis Wilke

57

Geçerli oturum için ayarlamak üzere şunları yapın:

SET time_zone = timezonename;

14
@@ session.time_zone SELECT;
James Skidmore

1
Sistemimdeki bazı hataları düzeltmeye çalışıyorum ve benim zaman dilimimi GMT'ye değil UTC'ye ayarlamam gerekiyor. '-0: 00' veya '+00: 00' olarak ayarladığımı biliyor musunuz, bu bir UTC ek açıklaması mı yoksa GMT ek açıklaması mı? Bu tür bilgileri bulamıyorum. Şerefe!
rafa.ferreira

@Castanho, ikisinin de iyi çalışacağından eminim. Bu soruya ilişkin açıklamaya göz atın: stackoverflow.com/questions/3466630/…
James Skidmore

Saat dilimi değeri PHP'de ayarlanan değerle aynı olabilir SET time_zone = 'America/Boise'. Cevabınız için teşekkürler, James Skidmore!
Adam F

1
@the_nuts evet, SET time_zone = 'UTC';sunucu yeniden başlatıldığında ayar kayboluyor
Timo Huovinen

48

Bunu MySQL sunucunuzda çalıştırmanız yeterlidir:

SET GLOBAL time_zone = '+8:00';

Burada +8: 00 saat diliminiz olacaktır.


14
Not, bu sadece Mysql yeniden
başlatana

Bir DB'ye bağlanırken nadiren süper kullanıcı ayrıcalıkları vardır. @@session.time_zoneDiğer cevaplarda açıklandığı gibi ayarlamak çok daha iyi bir yoldur.
colm.anseo

16

Hindistan'da bir yer için bu iş benim için:

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

bunu mysql'de sorgu olarak çalıştırmanız veya aşağıdaki sözdizimiyle my.conf altına yazmanız gerekir varsayılan 'time-zone ='
+05


11

Unutmayın, 'Ülke / Bölge' bazen çalışmıyor ... Bu sorun işletim sistemi, MySQL sürümü ve donanıma bağlı değil - 2003 yılında bugüne kadar FreeBSD 4 ve Slackware Linux'tan beri tanıştım. Sürüm 3'ten en son kaynak gövdesine kadar MySQL. ODD, ama OLUYOR. Örneğin:

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#

Ve böyle bir ifadenin çalışması gerekiyor:

SET time_zone='US/Eastern';

Ama bu problemin var:

Hata Kodu: 1298. Bilinmeyen veya yanlış saat dilimi: 'EUS / Eastern'

Bölge bilgileri dizininizdeki alt klasöre bir göz atın ve sembolik bağlantı için ACTUAL dosya adına bakın, bu durumda EST5EDT'dir. Sonra bunun yerine bu ifadeyi deneyin:

SET time_zone='EST5EDT';

Ve aslında olması gerektiği gibi çalışıyor! :) Bu numarayı aklınızda bulundurun; MySQL kılavuzlarında ve resmi belgelerde belgelendiğini görmedim. Ancak ilgili belgeleri okumak gerekir: MySQL 5.5 saat dilimi resmi belgeleri - ve saat dilimi verilerini sunucunuza yüklemeyi unutmayın (root kullanıcısı olarak çalıştırın!):

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

Birinci numara - tam olarak MySQL kök kullanıcısı altında yapılmalıdır. Bir MySQL veritabanına tam erişimi olan kullanıcıdan bile başarısız olabilir veya çalışmayan sonuç üretebilir - aksaklığı kendim gördüm.


Lütfen bana uname'inizi ve daha fazla ayrıntıyı söyleyin - Ubuntu masaüstü ve sunucusunda bazı çalışma durumlarınız var.
Alexey Vesnin


7

Bu 10 yıllık bir soru, ama yine de benim için işe yarayan şey bu. Hibernate 5 ve SpringBoot 4 ile MySQL 8.0 kullanıyorum.

Yukarıda kabul edilen cevabı denedim ama benim için çalışmadı, benim için işe yarayan şuydu:

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

Eğer bu yardımcı olursa, onu yükseltmeyi unutma: D


4

Eski bir soru daha bir öneri ile:

Yakın zamanda işletim sisteminin saat dilimini değiştirdiyseniz, örneğin:

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

... MySQL (veya MariaDB) db servisini yeniden başlatana kadar fark etmeyecektir:

service mysqld restart

(veya)

service mariadb restart

3

MySql Workbench kullanıyorsanız, yönetici görünümünü açıp Gelişmiş sekmesini seçerek bunu ayarlayabilirsiniz. Üst bölüm "Yerelleştirme" dir ve ilk onay kutusu "varsayılan saat dilimi" olmalıdır. Bu kutuyu işaretleyin ve istediğiniz saat dilimini girin, sunucuyu yeniden başlatın; devam etmeniz iyi olacaktır.


2
Sorun, belirli bir programla değil, MySQL ile ilgilidir.
fedorqui 'SO zarar vermeyi durdurun'

3
Böyle bir şey bulamadı.
Kzqai

1
Böyle bir şey yok
Green

MySQL Workbench 6.3 için: Eşgörünüm => Seçenekler dosyası => Genel => Uluslararası
paulus

5
[ MySQL Workbench 8.0 için GÜNCELLEME ] "Sunucu" => "Seçenekler Dosyası" nı seçin ve "Genel" sekmesinde "Uluslararası" bölümünün altına bakın . İlgili alanla birlikte "varsayılan saat dilimi" onay kutusu olacaktır. Böylece varsayılan saat dilimi değerini orada ayarlayabilirsiniz .
informatik01

3

Önce time_zone'un ne olduğunu sorgulayabilirsiniz

SHOW VARIABLES LIKE '%time_zone%'; 

Çıktınız aşağıdaki gibi olmalıdır

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

Sonra EST gibi bir şey yerine CDT gibi bir zaman dilimi içinde olduğunuzu doğrulamak istiyorsanız, makinenizin saat kaçta olduğunu düşündüğünü söyleyerek kontrol edebilirsiniz.

SELECT NOW();

Bu istediğiniz zaman değilse, değiştirmeniz gerekir ... tek yapmanız gereken SET time_zone = timezone_name. İçinde olduğundan emin olunContinent/City .

Barındırma hizmetiniz olduğu için paylaşılan bir sunucudaysanız, lütfen php.ini dosyasını veya .htaccess dosyasını değiştirme ile ilgili bu yanıtlara başvurun .


1
Önce denedim mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eve sonra SET time_zone = timezone_nameiyi çalıştım.
Barakat Turki

1

Konumunuzun saat dilimini ayarlamanız gerekir. Böylece aşağıdaki süreci izleyin
MSQLWorkbench açın böyle basit bir sql komutu yazın;

select now();

Ayrıca URL'niz de böyle olabilir;

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

@LuFFy bu konuda merak ettiğim şeydi, bu yüzden 'global' kapsam zaman dilimini değil, oturum kapsamı zaman dilimini kullanıyorsak, her db-connect için zaman dilimi ayarlanmalıdır. Uygulamanın farklı saat dilimlerinde kullanıcıları varsa oturum kapsamını kullanmak iyi, değil mi?
Valter Ekholm

1

MariaDB'de standart saat dilimini ayarlamak için 50-server.cnf dosyasına gitmelisiniz .

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

Sonra mysqld bölümüne aşağıdaki girişi girebilirsiniz.

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

Misal:

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

Değişiklik yapılandırma dosyası aracılığıyla yapılmalıdır, aksi takdirde MariaDB sunucusu mysql tablolarını yeniden başlattıktan sonra sıfırlar!



0

Windows'ta (IIS), GLOBAL time_zone = 'Europe / Helsinki' (veya her ne olursa olsun) ayarlayabilmek için önce MySQL time_zone açıklama tablolarının doldurulması gerekir.

Bunları bu bağlantıdan indirdim https://dev.mysql.com/downloads/timezones.html

İndirilen SQL sorgusunu çalıştırdıktan sonra GLOBAL time_zone ayarlayabilir ve SELECT NOW (); BST yerine GMT döndürüyordu.


Ben "Avrupa / Stockholm" yerine "+01: 00" sayı biçimini kullanabilirsiniz, bu yüzden time_zone açıklama tabloları indirmek gerek yoktu bence.
Valter Ekholm

0

Benim durumumda, çözüm Gelişmiş ayarlarda serverTimezone parametresini uygun bir değere (zaman dilimim için CET) ayarlamaktı.

IntelliJ kullanırken Veritabanı modülünü kullanıyorum. Veritabanına yeni bir bağlantı eklerken ve Genel sekmesine tüm ilgili parametreleri ekledikten sonra, "Bağlantıyı Test Et" düğmesinde bir hata oluştu. Yine, çözüm Gelişmiş sekmesinde serverTimezone parametresini ayarlamaktır.


0

Herkes GoDaddy Paylaşımlı Hosting kullanıyorsa, benim için çalışan aşağıdaki çözümü deneyebilirsiniz.

DB bağlantısını başlatırken, PDO nesnemde time_zone komutunu ayarlayın örn .:

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

Burada "+05: 30" Hindistan Saat Dilimi'dir. İhtiyacınıza göre değiştirebilirsiniz.

Daha sonra; Tarih ve Saat ile ilgili tüm MySQL işlemleri gerekli saat dilimiyle ayarlanır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.