タイムゾーンを確認

$ timedatectl
               Local time: Sat 2023-09-02 00:46:02 UTC
           Universal time: Sat 2023-09-02 00:46:02 UTC
                 RTC time: Sat 2023-09-02 00:46:02
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

表示だけなら sudo は不要です。

※1 /etc/timezone(Debian 系特有のファイル)

$ cat /etc/timezone
Etc/UTC

※2 date の出力

$ date
Sat Sep  2 00:51:47 UTC 2023

※3 実際のタイムゾーンは /etc/localtime(シンボリックリンク)で決まります。

$ ls -l /etc/localtime

Asia/Tokyo に変更

設定可能なタイムゾーンの一覧:

$ timedatectl list-timezones | grep Tokyo
Asia/Tokyo

変更:

$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl

[!NOTE]

  • サーバーのタイムゾーンは UTC のまま運用し、アプリケーション側で変換する方針も一般的です。ログの時刻が変わるため、変更する場合はチームで方針を揃えてください。
  • cron などの常駐プロセスは、変更後に再起動しないと反映されない場合があります。
  • PHP(date.timezone)や MySQL(default-time-zone)のタイムゾーンは別に設定します。

Docker

Docker の Ubuntu イメージは、タイムゾーンが指定されていないと、パッケージ(例: php, apache2)のインストール時に tzdata が依存関係として入り、タイムゾーンの選択を求められます。これを避けるため、対話を無効にして tzdata を先にインストールします。

公式の Ubuntu イメージには systemd が入っておらず、timedatectl も使えません1。Dockerfile で次のように設定します。

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN apt-get update \
 && apt-get install -y --no-install-recommends tzdata \
 && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
 && echo $TZ > /etc/timezone \
 && rm -rf /var/lib/apt/lists/*
  • 公式イメージには tzdata が含まれないため、/usr/share/zoneinfo を使うには tzdata のインストールが必要です。
  • DEBIAN_FRONTENDENV ではなく ARG にします(ENV にすると、コンテナ実行時にも設定が残るため)。
  1. timedatectlsystemd-timedated(D-Bus 経由)を使うため、systemd が PID 1 として動いている環境が必要です。コンテナに systemd パッケージを入れるだけでは動きません。