web-dev-qa-db-ja.com

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

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)
257
omg

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

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`

注:タイムゾーン を変更しても、保存されている日付時刻またはタイムスタンプ は変更されませんが、既存のタイムスタンプ列の日付時刻は異なります。

私はここでチートシートを作りました: MySQLはそのタイムゾーンをUTCに設定するべきですか?

426
Timo Huovinen

現在のセッションに設定するには、次の操作を行います。

SET time_zone = timezonename;
50
James Skidmore

MySQLまたはPHP用にタイムゾーンサーバを設定できる場合

覚えておいてください:

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

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

    /etc/init.d/mysql restart
    
47
jane

MySQLサーバーでこれを実行してください。

SET GLOBAL time_zone = '+8:00';

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

35
Rico Chan

まだこの問題を抱えている人のために:

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

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

32
Noel Murphy

これは私のためにインドの場所のために働く:

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

起動時にサーバーのデフォルトのタイムゾーンを指定できます。 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 を参照してください。

9
Alex Martelli

'Country/Zone'は時々動かないことを心に留めておいてください...この問題はOS、MySQLのバージョンおよびハードウェアに依存しません - 2003年のFreeBSD 4とSlackware Linux以来、今日に至るまで私はそれを満たしています。 MySQLはバージョン3から最新のソーストランクまで。それは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/Eastern」

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

SET time_zone='EST5EDT';

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

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

トリックナンバーワン - それは正確にMySQLのrootユーザーの下で行わなければなりません。 MySQLデータベースへのフルアクセス権を持っているユーザーであっても失敗したり、機能しない結果を生み出すことがあります - 私は自分自身でグリッチを見ました。

8
Alexey Vesnin

PDOを使用している場合

$offset="+10:00";
$db->exec("SET time_zone='".$offset."';");

MySQLiを使用している場合

$db->MySQLi->query("SET time_zone='".$offset."';");

ここでオフセットをフォーマットすることについての詳細: https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/ /

6
MeKoo Solutions

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

最近OSのタイムゾーンを変更した場合は、経由:

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

... MySQL(またはMariaDB)はdbサービスを再起動するまで気付かないでしょう:

service mysqld restart

(または)

service mariadb restart
4
inanutshellus

標準タイムゾーンを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
Lukas Kuntze

MySql Workbench を使用している場合は、管理者ビューを開いて[詳細設定]タブを選択してこれを設定できます。一番上のセクションは "Localization"で、最初のチェックボックスは "default-time-zone"です。そのチェックボックスをオンにしてから希望のタイムゾーンを入力し、サーバーを再起動してください。

1

まず、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_nameだけです。 Continent/City形式の形式であることを確認してください。

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

1
Erik Toor

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

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

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

0