Jak uzyskać aktualną strefę czasową MySQL?
Ktoś wie czy w MySQL jest taka funkcja?
UPDATE
To nie wyświetla żadnych ważnych informacji:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
A może sam MySQL nie może dokładnie znać time_zone
użytego, to dobrze, możemy zaangażować PHP
tutaj, o ile mogę uzyskać poprawne informacje nie jak SYSTEM
...
16 answers
Z sekcji manual (9.6):
Bieżące wartości globalnych i specyficznych dla klienta stref czasowych można pobrać w następujący sposób:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Edit powyższe zwraca SYSTEM
Jeśli MySQL jest ustawiony na slave do strefy czasowej systemu, co jest mniej niż pomocne. Ponieważ używasz PHP, jeśli odpowiedź z MySQL to SYSTEM
, możesz zapytać system, w jakiej strefie czasowej jest to używając via date_default_timezone_get
. (Oczywiście, jak wskazał VolkerK obecnie PHP może działać na innym serwerze, ale zgodnie z założeniami, zakładając, że serwer WWW i serwer DB, z którym rozmawia, są ustawione na [jeśli nie W ] ta sama strefa czasowa nie jest wielkim skokiem .) Ale uważaj (tak jak w przypadku MySQL), możesz ustawić strefę czasową, której używa PHP (date_default_timezone_set
), co oznacza, że może zgłaszać inną wartość niż używana przez system operacyjny. Jeśli masz kontrolę nad kodem PHP, powinieneś wiedzieć, czy to robisz i być ok.
Ale całe pytanie, jakiej strefy czasowej używa serwer MySQL, może być styczne, ponieważ pytanie serwera, w której strefie czasowej jest, mówi ci absolutnie nic o danych w bazie danych. Czytaj dalej po szczegóły:
Dalsza dyskusja :
Jeśli masz kontrolę nad serwerem, oczywiście możesz upewnić się, że strefa czasowa jest znana. Jeśli nie masz kontroli nad serwerem, możesz ustawić strefę czasową używaną przez połączenie tak:
set time_zone = '+00:00';
Ustawia strefę czasową na GMT, tak aby wszelkie dalsze operacje (np. now()
) używały GMT.
Należy jednak pamiętać, że wartości czasu i Daty są , a nie przechowywane z informacjami o strefie czasowej w 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)
Więc znajomość strefy czasowej serwera jest ważna tylko pod względem funkcji, które otrzymują czas w tej chwili, takich jak now()
, unix_timestamp()
, itd.; nie mówi nic o tym, jaką strefą czasową są daty w danych bazy danych używam. Możesz wybrać założyć zostały napisane przy użyciu strefy czasowej serwera, ale założenie to może być błędne. Aby poznać strefę czasową wszelkich dat lub godzin przechowywanych w danych, musisz upewnić się, że są one przechowywane z informacjami o strefie czasowej lub (tak jak ja) upewnić się, że są zawsze w GMT.
Dlaczego założenie, że dane zostały zapisane w strefie czasowej serwera jest błędne? Po pierwsze, dane mogły zostać zapisane przy użyciu połączenia, które ustawiło inną strefę czasową. Na baza danych mogła zostać przeniesiona z jednego serwera na drugi, gdzie serwery były w różnych strefach czasowych (wpadłem na to, gdy odziedziczyłem bazę danych, która przeniosła się z Teksasu do Kalifornii). Ale nawet jeśli dane są zapisywane na serwerze, z aktualną strefą czasową, nadal są niejednoznaczne. W zeszłym roku, w Stanach Zjednoczonych, czas letni został wyłączony o 2:00 w nocy 1 listopada. Załóżmy, że mój serwer jest w Kalifornii za pomocą strefy czasowej Pacyfiku i mam wartość 2009-11-01 01:30:00
w baza danych. Kiedy to było? Czy to było 1: 30 w nocy 1 listopada PDT, czy 1: 30 w nocy 1 listopada PST (godzinę później)? Nie możesz się dowiedzieć. Morał: zawsze przechowuj daty / godziny w GMT (co nie robi DST) i przekonwertuj do żądanej strefy czasowej jako / kiedy to konieczne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 09:08:53
Poniższe zapytanie zwraca strefę czasową bieżącej sesji.
select timediff(now(),convert_tz(now(),@@session.time_zone,'+00:00'));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 22:48:54
Po prostu
SELECT @@system_time_zone;
Zwraca PST
(lub cokolwiek jest istotne dla Twojego systemu).
Jeśli próbujesz określić strefę czasową sesji, możesz użyć tego zapytania:SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone);
Która zwróci strefę czasową sesji, jeśli różni się ona od strefy czasowej systemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 20:26:11
Jako Jakub Vrána (twórca lub Adminer i NotORM) wspomina w komentarzach, aby wybrać bieżące przesunięcie strefy czasowej w TIME
Użyj:
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
Zwróci: 02:00:00
jeśli Twoja strefa czasowa wynosi +2: 00 dla tej daty
Zrobiłem tu cheatsheet: czy MySQL powinien mieć ustawioną strefę czasową na UTC?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59
SELECT EXTRACT(HOUR FROM (TIMEDIFF(NOW(), UTC_TIMESTAMP))) AS `timezone`
Zwróci strefę czasową jako liczbę całkowitą (np: -6
), obsługując dodatnie lub ujemne czasy (tutaj pojawia się EXTRACT
: HOUR
sama funkcja zwraca ujemne strefy czasowe jako dodatnie).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 19:38:33
Aby uzyskać bieżącą strefę czasową mysql możesz zrobić następujące rzeczy:
- SELECT @ @ system_time_zone; / / z tego można uzyskać systemową strefę czasową
- SELECT IF (@@session.time_zone = 'SYSTEM', @ @ system_time_zone, @ @ session.time_zone) / / to da ci strefę czasową, jeśli systemowa Strefa czasowa różni się od globalnej strefy czasowej
Teraz jeśli chcesz zmienić strefę czasową mysql to: 1. SET GLOBAL time_zone = '+00:00' //spowoduje to ustawienie strefy czasowej mysql w UTC 2. SET @@ session.time_zone = "+00:00"; //w ten sposób można chnage strefy czasowej tylko dla danej sesji
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 08:52:21
Select sec_to_time( TIME_TO_SEC (curtime ()) + 48000); tutaj możesz określić swoje różnice czasowe jako sec
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 06:24:34
Sprawdź Obsługa strefy czasowej serwera MySQL i system_time_zone
zmienna systemowa. Czy to pomaga?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 23:33:48
Wystarczy ponownie uruchomić mysqld po zmianie strefy czasowej systemu..
Globalna Strefa czasowa MySQL zajmuje strefę czasową systemu. Po zmianie takiego atrybutu Systemu wystarczy ponownie uruchomić Mysqld.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-12 19:49:36
Wstaw fałszywy rekord do jednej z baz danych, która ma znacznik czasu Wybierz ten rekord i uzyskaj wartość znacznika czasu. Usuń ten rekord. Pobiera na pewno strefę czasową, której serwer używa do zapisu danych i ignoruje strefy czasowe PHP.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-27 09:49:59
Mój framework PHP używa
SET LOCAL time_zone='Whatever'
On after connect, where 'Whatever' = = date_default_timezone_get()
Nie moje rozwiązanie, ale to zapewnia SYSTEM
Strefa czasowa serwera MySQL jest zawsze taka sama jak PHP
Więc, tak, PHP jest silnie envolved i może wpływać na to
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 07:24:37
Użyj LPAD(TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP),'%H:%i'),6,'+'), aby uzyskać wartość w formacie strefy czasowej MySQL, której możesz wygodnie używać za pomocą convert_tz (). Zwróć uwagę, że przesunięcie strefy czasowej jest ważne tylko w momencie, w którym wyrażenie jest obliczane, ponieważ przesunięcie może zmieniać się w czasie, jeśli masz czas letni. Jednak wyrażenie jest użyteczne razem z NOW() do przechowywania offsetu z czasem lokalnym, co disambiguates what NOW() daje. (W strefach czasowych DST, NOW () odskakuje o godzinę raz w roku, więc ma kilka zduplikowanych wartości dla różnych punktów w czasie).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-24 18:46:47
Aby uzyskać bieżący czas zgodnie z twoją strefą czasową, możesz użyć następującego (w moim przypadku jego '+5:30')
Select DATE_FORMAT (convert_tz (now (), @ @ session.time_zone,'+05:30') ,'%Y - % m - % d')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-04 11:49:32
Polecenie wymienione w opisie zwraca "SYSTEM", który wskazuje, że zajmuje strefę czasową serwera. Co nie jest przydatne dla naszego zapytania.
Poniższe zapytanie pomoże zrozumieć strefę czasową
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;
Powyższe zapytanie poda przedział czasu w odniesieniu do Coordinated Universal Time(UTC). Możesz więc łatwo analizować strefę czasową. jeśli Strefa czasowa bazy danych jest IST, wyjście będzie 5: 30
UTC_TIMESTAMP
W MySQL, UTC_TIMESTAMP zwraca bieżącą datę i godzinę UTC jako wartość w "YYYY-MM-DD HH:MM:SS" lub YYYYMMDDHHMMSS.format Uuuuu w zależności od zastosowania funkcji tj. w kontekście łańcuchowym lub liczbowym.
Teraz()
Funkcja NOW (). MySQL NOW () Zwraca wartość bieżącej daty i godziny w formacie' YYYY-MM-DD HH:MM:SS' lub YYYYMMDDHHMMSS.format Uuuuu w zależności od kontekstu (liczbowego lub łańcuchowego) funkcji. CURRENT_TIMESTAMP, CURRENT_TIMESTAMP (), LOCALTIME, LOCALTIME (), LOCALTIMESTAMP, LOCALTIMESTAMP () są synonimami NOW().
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 13:44:48
It may be as stupid as this
Select timediff (current_time (), utc_time ())
Jak jest cały mysql
Nie otrzymasz bezpośrednio wartości strefy czasowej w ten sposób, ale gdyby nie było innego sposobu...
@@global.time_zone nie może być użyte w widoku, ponieważ jest zmienną-i zwraca całkiem bezużyteczną wartość 'SYSTEM' (nie mam czemu ktoś się tym przejmował)
Jeśli chcesz użyć zapytania w sesji ze zmienioną time_zone (przez session SET TIME_ZONE =), będziesz get that with @ @ session.time_zone jeśli zapytasz @ @ global.time_zone dostajesz 'SYSTEM' catch 22
Jeśli spróbujesz datediff, date_sub lub timediff z now() I utc_time () prawdopodobnie napotkasz problemy z konwersją, które będą cicho chowane przez serwer
Najgorsza dokumentacja, jaką widziałem, też Ci nie pomaga.
Świetna robota!
Ale coś sugerowane powyżej prawdopodobnie będzie działać przynajmniej z niektórymi wersjami serwera, jak jest mój (5.5.43-37) rozwiązanie hostowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 20:31:42
Spróbuj użyć następującego kodu:
//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 "¤tdate)
dbdate.Close()
Set dbdate = Nothing
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 19:21:46