tag:crieit.net,2005:https://crieit.net/tags/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3/feed 「タイムゾーン」の記事 - Crieit Crieitでタグ「タイムゾーン」に投稿された最近の記事 2022-02-25T22:46:15+09:00 https://crieit.net/tags/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3/feed tag:crieit.net,2005:PublicArticle/18125 2022-02-25T22:46:15+09:00 2022-02-25T22:46:15+09:00 https://crieit.net/posts/change-timzezone-in-docker-for-wordpress-post-failed-20220224 Docker 上の Almalinux のタイムゾーン設定について <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>AlmaLinux ベースの自作LAMP環境構築用 Docker で WordPress を動かしたところ、投稿が「予約投稿の失敗」となってしまい正常に投稿できない現象に遭遇したため対処。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p><a href="https://crieit.now.sh/upload_images/49f0d2b150a7b5d422313af680baf9ae62124ffe1e1d2.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/49f0d2b150a7b5d422313af680baf9ae62124ffe1e1d2.jpg?mw=700" alt="今までの設定で発生していた現象" /></a></p> <p>今までの Docker Compose 環境で発生していた現象が上述の画像。普通に投稿したにも関わらず、「予約投稿の失敗」となってしまいます。</p> <p>困ったことに WordPress の管理画面で見ると日時はずれていない (WordPress インストール時のサンプル投稿「Hello World!」の投稿日時とほぼ同じ) ので、ぱっと見原因が掴みづらいところ。</p> <p>ちなみに、 <code>wp_posts</code> のテーブルを直接見たところ、 <code>post_date</code>, <code>post_date_gmt</code>, <code>post_modified</code>, <code>post_modified_gmt</code> が全て同じ日時になっていました。</p> <p>……あれ、 <code>_gmt</code> 系はグリニッジ標準時刻なので日本の時刻とは9時間ずれるはずでは……。ということで、どうもこの辺りが宜しくなさそうです。</p> <p>なお、この時の Dockerfile 等の各種設定は次のようになっていました。</p> <h3 id="Dockerfile (共通)"><a href="#Dockerfile+%28%E5%85%B1%E9%80%9A%29">Dockerfile (共通)</a></h3> <pre><code class="dockerfile">RUN \cp -pf /usr/share/zoneinfo/Japan /etc/localtime </code></pre> <h3 id="php.ini"><a href="#php.ini">php.ini</a></h3> <pre><code class="ini">[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo' </code></pre> <h3 id="my.cnf 等"><a href="#my.cnf+%E7%AD%89">my.cnf 等</a></h3> <p>MySQL 側では特に指定なし。</p> <h2 id="変更"><a href="#%E5%A4%89%E6%9B%B4">変更</a></h2> <p>これらの設定を次のようにしました。</p> <h3 id="Dockerfile (共通)"><a href="#Dockerfile+%28%E5%85%B1%E9%80%9A%29">Dockerfile (共通)</a></h3> <pre><code class="dockerfile">RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux \ && dnf -y update && dnf -y install \ # 略 # timezone glibc-locale-source \ # locale, timezone && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 \ && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # local & timezone ENV LANG="ja_JP UTF-8" \ LANGUAGE="ja_JP:ja" \ LC_ALL="ja_JP.UTF-8" \ TZ="Asia/Tokyo" </code></pre> <p>やり方を大幅に変更。強制コピーで localtime ファイルを上書きするのではなく、段取りを踏んで設定するようにしました。</p> <h3 id="php.ini"><a href="#php.ini">php.ini</a></h3> <pre><code class="ini">[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = date.timezone = 'Asia/Tokyo' </code></pre> <p>変わらず。</p> <h3 id="my.cnf 等"><a href="#my.cnf+%E7%AD%89">my.cnf 等</a></h3> <p>こちらも変わらず。</p> <h3 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h3> <p><a href="https://crieit.now.sh/upload_images/d64288e5b382b9fe2564274e8237a20c6212500befe90.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d64288e5b382b9fe2564274e8237a20c6212500befe90.jpg?mw=700" alt="新しい設定方法で投稿した場合の挙動" /></a></p> <p>新しい方法で設定した Docker 環境上に先程と同様 WordPress をインストールして記事を投稿すると、無事投稿が公開されました。</p> <p>このとき、 <code>wp_posts</code> のテーブルを直接見ると、 <code>post_date</code>, <code>post_modified</code> は同じ日時、 <code>post_date_gmt</code>, <code>post_modified_gmt</code> は -9時間の日時になっていました。</p> <p>やはりここがおかしかったようです。</p> <h2 id="続・検証"><a href="#%E7%B6%9A%E3%83%BB%E6%A4%9C%E8%A8%BC">続・検証</a></h2> <p>さて、それではこの時刻の狂いはどこに起因しているのでしょうか。</p> <p><a href="https://crieit.now.sh/upload_images/67aea8dcc499e2cd3be8f9a4698e5de1621250140823c.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/67aea8dcc499e2cd3be8f9a4698e5de1621250140823c.jpg?mw=700" alt="Webサーバのみ新しい設定方法で投稿した場合の挙動" /></a></p> <p>Webサーバの Dockerコンテナ のみ今回の新しい方法で localtime を設定した場合。OKですね。</p> <p><a href="https://crieit.now.sh/upload_images/35de93c1057c97f109f3c8e152c7ec526212501e5c450.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/35de93c1057c97f109f3c8e152c7ec526212501e5c450.jpg?mw=700" alt="DBサーバのみ新しい設定方法で投稿した場合の挙動" /></a></p> <p>DBサーバの Dockerコンテナ のみ今回の新しい方法で localtime を設定した場合。NGです。</p> <p>ということで、原因は Webサーバ 側にありそうです。</p> <h3 id="Webサーバでの date"><a href="#Web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E3%81%AE+date">Webサーバでの date</a></h3> <p>ただ、 Webサーバ のコンテナで <code>date</code> コマンドを打っても日時は正しい日時が返ってくるのですよね。</p> <h4 id="設定方法が未変更の状態の Webサーバ コンテナ"><a href="#%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%8C%E6%9C%AA%E5%A4%89%E6%9B%B4%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%AE+Web%E3%82%B5%E3%83%BC%E3%83%90+%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">設定方法が未変更の状態の Webサーバ コンテナ</a></h4> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:06:21 # date Thu Feb 13 19:06:28 JST 2022 </code></pre> <h4 id="設定方法を変更した状態の Webサーバ コンテナ"><a href="#%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E7%8A%B6%E6%85%8B%E3%81%AE+Web%E3%82%B5%E3%83%BC%E3%83%90+%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">設定方法を変更した状態の Webサーバ コンテナ</a></h4> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:16:50 # date 2022年 2月 13日 日曜日 19:16:56 JST </code></pre> <p>ご覧の通り時刻は正常……ってあれ、確かに日時は正常ですが、出力フォーマットが異なっています。</p> <p>どうやら今までの設定変更ではやはり不完全な部分があるようです。どこが、というところまでは追い切れていないですが、ここまでの検証で確かに今までの設定方法では宜しくないであろう、ということが断片的に表われているので、ここは大人しく新しい設定方法に変更していった方が良さそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/rururu_kenken/items/972314402d588e073d40">Dockerコンテナのタイムゾーン変更方法 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/jeffi7/items/9d4c85cf049644f711b8">Docker で \/etc\/localtime をホストに volume マウントしてハマった話 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://saito-shion-technology.hatenablog.jp/entry/2020/02/27/115040">Docker : コンテナのタイムゾーンを変更する - saito-shion technology diary</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/polarbear08/items/e5c00869c7566db5f7b8">CentOS7・CentOS8のDockerコンテナの日本語化および日本時間設定 - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/18122 2022-02-23T00:13:45+09:00 2022-02-23T00:13:45+09:00 https://crieit.net/posts/output-timezone-datetime-of-php-and-mysql-20220223 PHP と MySQL のタイムゾーンや時刻の確認メモ <p>PHP や MySQL でタイムゾーンや時刻を確認したくなったのでメモ。</p> <h2 id="PHP"><a href="#PHP">PHP</a></h2> <pre><code class="bash"># php -r 'echo date_default_timezone_get() . PHP_EOL; echo date(&quot;y-m-d H:i:s&quot;) . PHP_EOL;' Asia/Tokyo 22-02-13 19:16:50 </code></pre> <p>コマンドライン実行でサクッと確認。</p> <h2 id="MySQL"><a href="#MySQL">MySQL</a></h2> <pre><code class="bash">mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec) mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2022-02-13 19:46:19 | +---------------------+ 1 row in set (0.00 sec) </code></pre> <p>こちらはSQL文で確認。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="PHP"><a href="#PHP">PHP</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.softel.co.jp/blogs/tech/archives/2077">【php】ちょっとしたphpをコマンドラインからさくっと実行する at softelメモ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.date.php">PHP: date - Manual</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.php.net/manual/ja/function.date-default-timezone-get.php">PHP: date_default_timezone_get - Manual</a></li> </ul> <h3 id="MySQL"><a href="#MySQL">MySQL</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://mysql.javarou.com/dat/000848.html">現在の日付・時刻を取得する - MySQL 逆引きリファレンス</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tailak/items/63dce2dd7dfe049b038e">MySQLでタイムゾーンを設定する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html">MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.6 MySQL Server でのタイムゾーンのサポート</a></li> </ul> arm-band