MySQLのタイムゾーンを設定するにはどうすればよいですか?


339

1つのサーバーで実行すると:

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

別のサーバー:

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

:しかし、それほど重要でない時間ドリフトにも-そこだけではなく、ここでのタイムゾーンの違いだ「についてのあなたのDBAにトークntp-あなたにぴったりのものを参照してください!」
colm.anseo

@ colm.anseo落ち着いて、それはおそらくクエリの実行の違いでしょう
HosseyNJF

1
@HosseyNJFは7分ですか?比較の合間にコーヒーブレイク?
colm.anseo

回答:


525

私はこれが役に立つかもしれないと思った:

MySQLでタイムゾーンを設定できる場所は3つあります。

[mysqld]セクションの「my.cnf」ファイル

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

@@ global.time_zone変数

それらに設定されている値を確認するには:

SELECT @@global.time_zone;

値を設定するには、次のいずれかを使用します。

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

( 'Europe / Helsinki'のような名前付きタイムゾーンを使用することは、タイムゾーンテーブルを適切に設定する必要があることを意味します。)

これ+02:00はオフセットです。Europe/Berlin(2つのオフセットを持つ)タイムゾーンでありCEST、特定のオフセットに対応する時刻です。

@@ session.time_zone変数

SELECT @@session.time_zone;

設定するには、次のいずれかを使用します。

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

どちらもSYSTEMを返す場合があります。これは、my.cnfで設定されたタイムゾーンを使用することを意味します。

タイムゾーン名を機能させるには、タイムゾーン情報テーブルを設定する必要があります(http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html)この回答では、これらのテーブルにデータを設定する方法についても触れています

現在のタイムゾーンのオフセットを取得するには TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

タイムゾーンが+2:00の場合、02:00:00を返します。

現在のUNIXタイムスタンプを取得するには:

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

タイムスタンプ列をUNIXタイムスタンプとして取得するには

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

UTC日時列をUNIXタイムスタンプとして取得するには

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

注:タイムゾーンを変更しても、保存されている日時またはタイムスタンプは変更されませんが、既存のタイムスタンプカラムは内部的にUTCタイムスタンプとして保存され、現在のMySQLタイムゾーンで外部的に表示されるため、異なる日時が表示されます。

ここでチートシートを作成しました:MySQLのタイムゾーンをUTCに設定する必要がありますか?


3
+00:00タイムゾーンではなく、時間オフセットです。DSTに関してはどうなりますか?年間を通して+0のままですか?
mpen 2014年

1
@Markわかりません、ドキュメントでは、UTCからのオフセットを使用しtime_zone="+00:00"タイムゾーンを設定しているときに、設定値が決して変更されず、UTCがDSTに従っていないことを考えると、通年同じであると想定できます。
Timo Huovinen、2014年

1
@TimoHuovinen申し訳ありませんが、オフセットのように+00:00 見えるので、MySQLが文字列「UTC」自体を使用するのではなく、UTCを表すためにそれを選択したのはちょっと不思議です。情報をありがとう。
mpen 2014年

1
00、私はこのエラーを取得:私は00に設定されたエラー:設定ファイル内のグループの前にせずに見つかったオプション:な/etc/my.cnf
ヤーノシュ

5
Win7では、mysql設定ファイルへのパスはC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca

82

この問題が解決しない場合:

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

私のために働いた。?serverTimezone=UTC最後に追加するだけです。


タイムゾーンがUTC + 7の場合、接続文字列でそれをどのように指定できますか?「?serverTimezone = UTC + 7」を追加しようとしましたが、機能しません。
チェンNghê

1
問題はJDBCに関するものではなく、MySQL自体に関するものでした。
Luiz

2
@ChiếnNghê:BTWのAsia/Ho_Chi_Minh代わりに使用する必要がありますUTC。問題は、MySQLタイムゾーンの変更についてです。@Timoの回答をご覧ください。MySQL Dockerで問題が発生した場合は、TZ環境を追加すると動作します。
Liem Le 2018

2
これ、サーバーのタイムゾーン JDBCに通知するだけで、変更はしません。セッションのタイムゾーンを設定するには、使用する回答を確認してくださいSET time_zone=...
NikolaMihajlović2018

CDTエラーが発生しましたが、これで修正されました。
Akexis

58

MySQLまたはPHPのタイムゾーンサーバーを構成できる場合:

覚えておいてください:

  1. タイムゾーンシステムを変更します。Ubuntuの例:

    $ sudo dpkg-reconfigure tzdata
  2. サーバーを再起動するか、Apache 2とMySQLを再起動します。

    /etc/init.d/mysql restart

2
たぶん、このアプローチは適切ではないかもしれません。UTCを備えたサーバーがある状況について考えてみてください。ただし、アプリケーションはUTC -0600の国にデータを提供しています。MySQLのタイムゾーンを調整するには、はるかに良いかもしれません。
ivanleoncz

1
特に、複数のタイムゾーンをカバーする地域で作業している場合。
Alexis Wilke

57

現在のセッションに設定するには、次のようにします。

SET time_zone = timezonename;

14
SELECT @@ session.time_zone;
James Skidmore、

1
システムのいくつかのエラーを修正しようとしています。time_zoneをGMTではなくUTCに設定する必要があります。「-0:00」または「+00:00」に設定したかどうか、これはUTC注釈かGMT注釈かわかりますか?私はこの特定の情報を見つけられません。乾杯!
rafa.ferreira

@Castanho、どちらでもうまくいくと思います。この質問に説明をチェックアウト:stackoverflow.com/questions/3466630/...
ジェームズ・スキッドモア

タイムゾーンの値は、などのPHPで設定されたものと同じにすることができますSET time_zone = 'America/Boise'。答えてくれてありがとう、ジェームズ・スキッドモア!
アダムF

1
@the_nutsはい、SET time_zone = 'UTC';サーバーの再起動中に設定が失われます
Timo Huovinen

48

これをMySQLサーバーで実行するだけです。

SET GLOBAL time_zone = '+8:00';

+8:00がタイムゾーンになります。


14
これは、MySQLを再起動するまでの一時的なものであることに注意してください
rubo77

DBに接続するときに、スーパーユーザー権限を持つことはほとんどありません。@@session.time_zone他の回答で説明されている設定の方がはるかに良い方法です。
colm.anseo

16

インドの場所のための私のためのこの仕事:

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

これをmysqlでクエリとして実行するか、my.confで次の構文を使用して書き込む必要があります。default-time-zone = '
+05

11

起動時にサーバーのデフォルトのタイムゾーンを指定できます。http://dev.mysql.com/doc/refman/5.1/en/server-options.htmlを参照してください--default-time-zone=timezone。具体的にはオプションです。グローバルおよびセッションのタイムゾーンを確認するには、

SELECT @@global.time_zone, @@session.time_zone;

SET&c;ステートメントでいずれかまたは両方を設定します。詳細については、http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.htmlを参照してください。


11

「国/ゾーン」が時々機能しないことに注意してください...この問題はOS、MySQLのバージョン、ハードウェアに依存しません-FreeBSD 4とSlackware Linux以来、2003年に今日まで問題に遭遇しました。バージョン3から最新のソーストランクまでのMySQL。ODDですが、発生します。例えば:

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#

そして、そのようなステートメントはうまくいくはずです:

SET time_zone='US/Eastern';

しかし、あなたはこの問題を抱えています:

エラーコード:1298。不明または誤ったタイムゾーン: 'EUS /東部'

ゾーン情報ディレクトリのサブフォルダを確認し、symlinkの実際のファイル名を確認します。この場合はEST5EDTです。次に、代わりに次のステートメントを試してください。

SET time_zone='EST5EDT';

そして、それは実際に想定どおりに機能しています!:)このトリックを覚えておいてください。MySQLのマニュアルや公式のドキュメントに記載されているのを見たことがありません。しかし、対応するドキュメントを読むことは必須のことです。MySQL5.5タイムゾーン公式ドキュメント -タイムゾーンデータをサーバーにロードすることを忘れないでください(rootユーザーとして実行してください)。

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

トリック第1-MySQLのrootユーザーの下で正確に実行する必要があります。MySQLデータベースへの完全なアクセス権を持つユーザーであっても、失敗するか、機能しない結果を生成する可能性があります-私はグリッチを自分で見ました。


uname -aと詳細を教えてください。Ubuntuデスクトップとサーバーでいくつかの動作例があります。
Alexey Vesnin 14


7

これは10年前の質問ですが、とにかくここで私にとってうまくいきました。MySQL 8.0とHibernate 5およびSpringBoot 4を使用しています。

私は上記の受け入れられた答えを試しましたが、私にとってはうまくいきませんでした、私にとってうまくいったのはこれです:

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

これが役立つ場合は、それを賛成することを忘れないでください:D


4

もう1つの提案がある古代の質問:

OSのタイムゾーンを最近変更した場合(例:

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

... MySQL(またはMariaDB)はdbサービスを再起動するまで気づきません:

service mysqld restart

(または)

service mariadb restart

3

MySql Workbenchを使用している場合は、管理者ビューを開いて[詳細設定]タブを選択することで設定できます。上部のセクションは「ローカリゼーション」であり、最初のチェックボックスは「default-time-zone」である必要があります。そのボックスにチェックを入れて、希望のタイムゾーンを入力し、サーバーを再起動すれば問題ありません。


2
この問題は特定のプログラムではなくMySQLに関連しています。
fedorqui「SO害をやめる」2013

3
そのようなものが見つかりませんでした。
Kzqai 2016年

1
そのようなものは何もありません
Green

MySQL Workbench 6.3の場合:インスタンス=>オプションファイル=>一般=>インターナショナル
paulus

5
[ MySQL Workbench 8.0の更新 ] [サーバー] => [オプションファイル]を選択し、[全般]タブの[インターナショナル] セクションの下を参照します。関連フィールドとともに「デフォルトタイムゾーン」チェックボックスがあります。そこで、デフォルトのタイムゾーン値を設定できます
informatik01

3

最初に、クエリできるtime_zoneを確認します

SHOW VARIABLES LIKE '%time_zone%'; 

出力は次のようになります。

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

次に、ESTなどではなく、CDTなどのタイムゾーンにいることを確認したい場合は、次のようにして、マシンが何時間と考えているかを確認できます。

SELECT NOW();

これが必要な時間でない場合は、変更する必要があります...必要なのはだけですSET time_zone = timezone_nameContinent/Cityフォーマットされているものであることを確認してください。

ホスティングサービスがあるために共有サーバーを使用している場合は、php.iniファイルまたは.htaccessファイルの変更に関するこれらの回答を参照してください。


1
私はmysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p E最初に試し、それからSET time_zone = timezone_nameうまくいきました。
Barakat Turki

1

現在地のタイムゾーンを設定する必要があります。したがって、以下のプロセスに従って
ください。MSQLWorkbenchを開き、次のような簡単なsqlコマンドを記述します。

select now();

また、URLは次のようになります。

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

@LuFFyこれは私が不思議に思っていたものなので、「グローバル」スコープのタイムゾーンではなくセッションスコープのタイムゾーンを使用している場合は、db-connectごとにタイムゾーンを設定する必要があります。アプリにさまざまなタイムゾーンのユーザーを含めることができる場合は、セッションスコープを使用するのが良いでしょう。
Valter Ekholm

1

MariaDBで標準のタイムゾーンを設定するには、50-server.cnfファイルに移動する必要があります。

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

次に、mysqldセクションに次のエントリを入力できます。

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

例:

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

変更は構成ファイルを介して行う必要があります。そうしないと、MariaDBサーバーが再起動後にmysqlテーブルをリセットします。


1

MySQL構成ファイルを編集する

sudo nano /etc/mysql/my.cnf

スクロールして、これらを下部に追加します。関連するタイムゾーンに変更

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

サーバーを再起動します

sudo service mysql restart

0

Windows(IIS)では、グローバルを設定できるようにするために、time_zone = 'Europe / Helsinki'(または何でも)MySQLのtime_zone記述テーブルを最初に設定する必要があります。

これらをこのリンクからダウンロードしましたhttps://dev.mysql.com/downloads/timezones.html

ダウンロードしたSQLクエリを実行した後、GLOBAL time_zoneを設定して、SELECT NOW();の問題を解決できました。BSTではなくGMTを返していました。


「ヨーロッパ/ストックホルム」の代わりに数値形式「+01:00」を使用できるので、time_zone記述テーブルをダウンロードする必要はなかったと思います。
Valter Ekholm

0

私の場合、解決策は、詳細設定のserverTimezoneパラメータを適切な値(私のタイムゾーンのCET)に設定することでした。

IntelliJを使用するときは、そのデータベースモジュールを使用します。新しい接続をデータベースに追加しているときに、関連するすべてのパラメーターを[全般]タブに追加した後、[接続のテスト]ボタンでエラーが発生しました。この場合も、解決策は[詳細]タブでserverTimezoneパラメータを設定することです。


0

誰かがGoDaddy共有ホスティングを使用している場合、私のために働いた次の解決策を試すことができます。

DB接続を開始するときに、PDOオブジェクトにtime_zoneコマンドを設定します。例:

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

「+05:30」はインドのタイムゾーンです。必要に応じて変更できます。

その後; 日付と時刻に関連するすべてのMySQLプロセスには、必要なタイムゾーンが設定されています。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.