Jak ustawić strefę czasową MySQL?

339

Na jednym serwerze, kiedy uruchamiam:

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

Na innym serwerze:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
o mój Boże
źródło
Nie ma tu tylko różnicy stref czasowych - ale także nie tak nieznaczny dryf czasowy: „Porozmawiaj z DBA o ntp- i zobacz, co jest dla Ciebie odpowiednie!”
colm.anseo
@ colm.anseo Uspokój się, prawdopodobnie jest to różnica między uruchamianiem zapytań
HosseyNJF
1
@HosseyNJF o 7 minut? Przerwa na kawę między porównaniami?
colm.anseo

Odpowiedzi:

525

Myślałem, że to może być przydatne:

Istnieją trzy miejsca, w których strefa czasowa może być ustawiona w MySQL:

W pliku „my.cnf” w sekcji [mysqld]

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

@@ zmienna global.time_zone

Aby zobaczyć, jaką wartość są ustawione:

SELECT @@global.time_zone;

Aby ustawić dla niego wartość, użyj jednego z nich:

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

(Użycie nazwanych stref czasowych, takich jak „Europa / Helsinki” oznacza, że ​​musisz odpowiednio wypełnić tabelę stref czasowych).

Pamiętaj, że +02:00jest to przesunięcie. Europe/Berlinjest strefą czasową (która ma dwa przesunięcia) i CESTjest czasem zegarowym, który odpowiada konkretnemu przesunięciu.

@@ zmienna session.time_zone

SELECT @@session.time_zone;

Aby ustawić, użyj jednego z nich:

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

Oba mogą zwrócić SYSTEM, co oznacza, że ​​używają strefy czasowej ustawionej w my.cnf.

Aby nazwy stref czasowych działały, musisz skonfigurować tabele informacyjne stref czasowych: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Wspominam również, jak wypełnić te tabele w tej odpowiedzi .

Aby uzyskać bieżące przesunięcie strefy czasowej jako TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Zwróci 02:00:00, jeśli twoja strefa czasowa to +2: 00.

Aby uzyskać bieżący znacznik czasu UNIX:

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

Aby uzyskać kolumnę znacznika czasu jako znacznik czasu UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Aby uzyskać kolumnę godziny UTC jako znacznik czasu UNIX

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

Uwaga: Zmiana strefy czasowej nie zmieni przechowywanej daty ani godziny , ale pokaże inną datę w istniejących kolumnach znaczników czasu, ponieważ są one wewnętrznie przechowywane jako znaczniki czasu UTC i są wyświetlane zewnętrznie w bieżącej strefie czasowej MySQL.

Zrobiłem tutaj cheatheet: Czy MySQL powinien mieć strefę czasową ustawioną na UTC?

Timo Huovinen
źródło
3
+00:00to nie strefa czasowa, to przesunięcie czasowe. Co dzieje się w odniesieniu do DST? Czy pozostaje na poziomie +0 przez cały rok?
mpen
1
@Mark Nie jestem pewien, docs powiedzieć, że przy ustalaniu time_zone="+00:00"jesteś ustawiania strefy czasowej przy użyciu przesunięcie od UTC, biorąc pod uwagę, że wartość zestaw nigdy się nie zmienia i że nie wynika UTC DST mogę założyć, że pozostaje taka sama przez cały rok.
Timo Huovinen
1
@TimoHuovinen Przepraszam, miałem na myśli, że +00:00 wygląda to na przesunięcie, więc to trochę dziwne, że MySQL wybrał to do reprezentowania UTC zamiast po prostu samego łańcucha „UTC”. Dzięki za informację.
mpen
1
Ustawiłem +00: 00, ale dostaję ten błąd: błąd: Znaleziono opcję bez poprzedzającej grupy w pliku konfiguracyjnym: /etc/my.cnf
János
5
w Win7 ścieżka do pliku ustawień mysql toC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
83

Dla każdego, kto nadal ma ten problem:

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

Pracował dla mnie. Wystarczy dołączyć ?serverTimezone=UTCna końcu.

Noel Murphy
źródło
Jeśli moją strefą czasową jest UTC + 7, jak mogę to określić w ciągu połączenia? Próbowałem dodać „? ServerTimezone = UTC + 7” i to nie działa.
Chiến Nghê
1
Pytanie nie dotyczyło JDBC, ale samego MySQL.
Luiz
2
@ ChiếnNghê: Powinieneś użyć Asia/Ho_Chi_Minhzamiast UTCBTW, pytanie dotyczy zmiany strefy czasowej MySQL. Więc spójrz na odpowiedź @Timo. Jeśli masz problemy z dokerem MySQL, dodaj środowisko TZ i powinno działać.
Liem Le
2
To tylko informuje JDBC, jaka jest strefa czasowa serwera, ale tego nie zmienia. Aby ustawić strefę czasową sesji, sprawdź odpowiedzi, które wykorzystująSET time_zone=...
Nikola Mihajlović
Otrzymywałem błąd CDT, ale to mnie naprawiło.
Akexis,
58

Kiedy możesz skonfigurować serwer strefy czasowej dla MySQL lub PHP:

Zapamiętaj:

  1. Zmień system strefy czasowej. Przykład dla Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Uruchom ponownie serwer lub możesz ponownie uruchomić Apache 2 i MySQL:

    /etc/init.d/mysql restart
Jane
źródło
2
Może to podejście może nie być właściwe. Pomyśl o sytuacji posiadania serwera z UTC, ale twoja aplikacja obsługuje dane w kraju na UTC -0600. Dostosowanie strefy czasowej dla MySQL może być znacznie lepsze.
ivanleoncz
1
Zwłaszcza jeśli pracujesz w obszarze obejmującym wiele stref czasowych.
Alexis Wilke
57

Aby ustawić go dla bieżącej sesji, wykonaj:

SET time_zone = timezonename;
James Skidmore
źródło
14
WYBIERZ @@ session.time_zone;
James Skidmore
1
Próbuję naprawić niektóre błędy w moim systemie i muszę ustawić strefę czasową na UTC, a nie GMT. Czy wiesz, że jeśli ustawię wartość „-0: 00” lub „+00: 00”, jest to adnotacja UTC lub adnotacja GMT? Niby NIE znajduję tych konkretnych informacji. Twoje zdrowie!
rafa.ferreira
@Castanho, jestem pewien, że jedno z nich będzie dobrze działać. Sprawdź wyjaśnienie tego pytania: stackoverflow.com/questions/3466630/…
James Skidmore
Wartość strefy czasowej może być taka sama jak ustawiona w PHP, np SET time_zone = 'America/Boise'. Dzięki za odpowiedź, James Skidmore!
Adam F
1
@ orzechy tak, SET time_zone = 'UTC';ustawienie gubi się podczas restartu serwera
Timo Huovinen
48

Po prostu uruchom to na swoim serwerze MySQL:

SET GLOBAL time_zone = '+8:00';

Gdzie +8: 00 będzie Twoją strefą czasową.

Rico Chan
źródło
14
Zauważ, że jest to tylko tymczasowe, dopóki nie uruchomisz ponownie MySQL
rubo77
Rzadko ma się uprawnienia administratora w przypadku łączenia się z bazą danych. Ustawienie @@session.time_zoneopisane w innych odpowiedziach jest znacznie lepszą trasą.
colm.anseo
16

Ta praca dla mnie dla lokalizacji w Indiach:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
źródło
musisz uruchomić to jako zapytanie na mysql lub napisać pod my.conf z następującą składnią default-time-zone = '+05: 30'
Swapnil Bijwe
11

Pamiętaj, że „Country / Zone” czasami nie działa… Ten problem nie zależy od systemu operacyjnego, wersji MySQL i sprzętu - poznałem go od FreeBSD 4 i Slackware Linux w 2003 roku do dziś. MySQL od wersji 3 do najnowszej wersji źródłowej. Jest ODD, ale tak się dzieje. Na przykład:

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#

Takie oświadczenie powinno działać:

SET time_zone='US/Eastern';

Ale masz ten problem:

Kod błędu: 1298. Nieznana lub nieprawidłowa strefa czasowa: „EUS / Eastern”

Spójrz na podfolder w katalogu informacji o strefie i zobacz AKTUALNĄ nazwę pliku dla dowiązania symbolicznego, w tym przypadku jest to EST5EDT. Następnie wypróbuj to oświadczenie:

SET time_zone='EST5EDT';

I faktycznie działa tak, jak powinien! :) Pamiętaj o tej sztuczce; Nie widziałem, aby było to udokumentowane w instrukcjach MySQL i oficjalnej dokumentacji. Ale czytanie odpowiedniej dokumentacji jest koniecznością: oficjalna dokumentacja strefy czasowej MySQL 5.5 - i nie zapomnij załadować danych strefy czasowej na swój serwer tak (uruchom jako użytkownik root!):

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

Sztuczka numer jeden - musi być wykonana dokładnie pod rootem MySQL. Może to zawieść lub wygenerować niedziałający wynik nawet od użytkownika, który ma pełny dostęp do bazy danych MySQL - sam widziałem usterkę.

Alexey Vesnin
źródło
Proszę, powiedz mi swoją nazwę - i dodatkowe szczegóły - mam kilka spraw roboczych na komputerze i serwerze Ubuntu.
Alexey Vesnin
7

To pytanie ma 10 lat, ale i tak oto działało dla mnie. Używam MySQL 8.0 z Hibernacja 5 i SpringBoot 4.

Wypróbowałem powyższą akceptowaną odpowiedź, ale nie działało to dla mnie, co zadziałało dla mnie:

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

Jeśli to pomoże, nie zapomnij go głosować: D

szabla hamza
źródło
4

Starożytne pytanie z jeszcze jedną sugestią:

Jeśli ostatnio zmieniłeś strefę czasową systemu operacyjnego, np. Przez:

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

... MySQL (lub MariaDB) nie zauważy, dopóki nie uruchomisz ponownie usługi db:

service mysqld restart

(lub)

service mariadb restart
inanutshellus
źródło
3

Jeśli korzystasz z MySql Workbench, możesz to ustawić, otwierając widok administratora i wybierając zakładkę Zaawansowane. Górna sekcja to „Lokalizacja”, a pierwszym polem wyboru powinna być „domyślna strefa czasowa”. Zaznacz to pole, a następnie wprowadź żądaną strefę czasową, uruchom ponownie serwer i powinieneś już iść.

Taylor Lafrinere
źródło
2
Problem dotyczy MySQL, a nie konkretnego programu.
fedorqui „SO przestań szkodzić”
3
Nie znalazłem nic takiego.
Kzqai,
1
Nic takiego
Green
Dla MySQL Workbench 6.3: Instancja => Plik opcji => Ogólne => Międzynarodowe
Paul
5
[ UPDATE MySQL Workbench 8.0 ] wybierz "Serwer" => "File Options", a na "Ogólne" kartę patrz poniżej "International" sekcji . Będzie pole wyboru „domyślna strefa czasowa” wraz z powiązanym polem. Możesz więc ustawić tam domyślną wartość strefy czasowej .
informatik01
3

Najpierw dowiedz się, jaka jest strefa czasowa, którą możesz zapytać

SHOW VARIABLES LIKE '%time_zone%'; 

Twój wynik powinien wyglądać podobnie do poniższego

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

Następnie, jeśli chcesz potwierdzić, że masz strefę czasową, taką jak CDT, a nie EST, możesz sprawdzić, o której godzinie myśli, że Twoja maszyna

SELECT NOW();

Jeśli nie jest to czas, którego chcesz, musisz to zmienić ... wszystko, co musisz zrobić, to zrobić SET time_zone = timezone_name. Upewnij się, że jest to Continent/Cityformat.

Jeśli korzystasz z serwera współdzielonego, ponieważ masz usługę hostingową, zapoznaj się z tymi odpowiedziami dotyczącymi zmiany pliku php.ini lub pliku .htaccess.

Erik Toor
źródło
1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p ENajpierw próbowałem, a potem SET time_zone = timezone_namedziałało dobrze.
Barakat Turki
1

Musisz ustawić strefę czasową swojej lokalizacji. Aby postępować zgodnie z poniższym procesem
Otwórz MSQLWorkbench, napisz prostą komendę SQL, taką jak ta;

select now();

Twój adres URL może być taki;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
źródło
@LuFFy zastanawiałem się nad tym, więc dla każdego połączenia db należy ustawić strefę czasową JEŚLI używamy strefy czasowej zakresu sesji, a nie strefy czasowej zakresu globalnego. Warto korzystać z zakresu sesji, jeśli aplikacja może mieć użytkowników w różnych strefach czasowych, prawda?
Valter Ekholm
1

Aby ustawić standardową strefę czasową w MariaDB , musisz przejść do pliku 50-server.cnf .

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

Następnie możesz wprowadzić następujący wpis w sekcji mysqld.

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

Przykład:

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

Zmian należy dokonać za pomocą pliku konfiguracyjnego, w przeciwnym razie serwer MariaDB zresetuje tabele mysql po ponownym uruchomieniu!

Lukas Kuntze
źródło
1

Edytuj plik konfiguracyjny MySQL

sudo nano /etc/mysql/my.cnf

Przewiń i dodaj je na dole. Zmień odpowiednią strefę czasową

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

Uruchom ponownie serwer

sudo service mysql restart
Ivan_ug
źródło
0

W systemie Windows (IIS), aby móc ustawić GLOBALNĄ strefę czasową = „Europa / Helsinki” (lub cokolwiek innego), najpierw należy wypełnić tabele opisu strefy czasowej MySQL.

Pobrałem je z tego linku https://dev.mysql.com/downloads/timezones.html

Po uruchomieniu pobranego zapytania SQL udało mi się ustawić GLOBALNĄ strefę czasową i rozwiązać problem, w którym miałem WYBIERZ TERAZ (); zwracał raczej GMT niż BST.

Stewart Kirkpatrick
źródło
Mógłbym użyć formatu liczbowego „+01: 00” zamiast „Europa / Sztokholm”, więc myślę, że nie musiałem ściągać tabel opisu strefy czasowej.
Valter Ekholm
0

W moim przypadku rozwiązaniem było ustawienie parametru serverTimezone w Ustawieniach zaawansowanych na odpowiednią wartość (CET dla mojej strefy czasowej).

Gdy korzystam z IntelliJ, korzystam z jego modułu bazy danych. Podczas dodawania nowego połączenia do bazy danych i po dodaniu wszystkich odpowiednich parametrów w zakładce Ogólne wystąpił błąd przycisku „Testuj połączenie”. Ponownie rozwiązaniem jest ustawienie parametru serverTimezone w zakładce Zaawansowane.

ognjenkl
źródło
0

Jeśli ktoś korzysta z GoDaddy Shared Hosting, możesz wypróbować następujące rozwiązanie, które dla mnie zadziałało.

Podczas uruchamiania połączenia z DB ustaw komendę time_zone w moim obiekcie PDO, np .:

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

Gdzie „+05: 30” to strefa czasowa Indii. Możesz to zmienić zgodnie ze swoimi potrzebami.

Po tym; wszystkie procesy MySQL związane z datą i godziną są ustawione na wymaganą strefę czasową.

Źródło: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Ashish Pandey
źródło