13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux の date コマンドを日本時間に変換したい。ロケールやファイルをいじらず UTC 環境のまま【UTC→JST】

Last updated at Posted at 2019-05-29

date コマンド実行時のみ日本時間で表示させたい

自動化のため Git のコミット時のコメントに、ビルド時の日付を UTC でなく日本時間(JST)で記録させたい。

しかし、Alpine の Docker イメージなど、デフォルトが UTC で、ロケールも asia/tokyo になっておらず、軽量化のためタイムゾーン・ファイルも /usr/share/zoneinfo/Asia/ にない。

普通はパッケージを入れるなりすればいいのです。しかし、ログ的に確認するためだけに Docker イメージにレイヤーを増やしたくないのです。

Qiita 記事に絞って「linux date 変換 utc jst 日本時間」とググって」もタイトルからストレートにわかる記事がありませんでした。記事を開いてもファイルの修正が必要だったり、すでにロケールが asia/tokyo を前提だったりしたので、自分のググラビリティとして。

TL; DR (今北産業)

  1. 環境変数 TZ=-9date コマンドの前に付ける。
  2. 日本時間は +09:00+9 進んでいるので -9 で引いてあげる。
  3. 注意: 設定が UTC でなく JST なのに TZ=-9 してしまうと、さらに狂う。

UTC

デフォルト(現在時刻=日本時間の12:08PM)
$ date
Wed May 29 03:08:21 UTC 2019

$ TZ=-9 date '+%a %b %d %H:%M:%S JST %Y'
Wed May 29 12:08:24 JST 2019

RFC-2822 互換

デフォルト(現在時刻=日本時間の11:53AM)
$ date -R
Wed, 29 May 2019 02:53:05 +0000

$ TZ=-9 date -R
Wed, 29 May 2019 11:53:10 +0900

ISO-8601 互換

デフォルト(現在時刻=日本時間の12:19PM)
$ date -Iseconds
2019-05-29T03:19:26+0000

$ TZ=-9 date -Iseconds
2019-05-29T12:19:45+0900

TS; DR (コンテナでコンパイる、たかが日本時間にするためだけの細かいこと)

Go言語(golang)で Hugo のコンパイル時に日本時刻でビルド時間を渡したかった

Markdown から静的 Web ページを作成する Jekyll の golang 版とも言える "HUGO" というフレームワークがあります。いわゆるひとつの静的サイトジェネレーターというやつです。

これを Docker 上でビルドして使おうと思いました。具体的には Alpine Linux ベースのコンテナ上で動かすために安定版のソースからビルド(コンパイル)して、マルチステージで軽量コンテナ(イメージ)を作ろうとしたのです。

ま、ローカルに軽量の仮想ビルド環境を作りたかったのです。

コンパイルまでは正常にできたのですが、バージョン情報を表示させると、BuildDate: unknown とビルドの日付が設定されていませんでした。まぁ、自分でビルドしていて、ビルド日付を渡していないので当然です。

普通にビルド
$ go build -a --ldflags '-extldflags "-static"' -o /go/bin/hugo main.go
...

$ /go/bin/hugo version
Hugo Static Site Generator v0.55.6 linux/amd64 BuildDate: unknown

ソースの方をいじってもいいのですが、ビルド時に変数を渡した方がシンプルというものです。

日付データを渡してビルド
$ go build -a \
> --ldflags '-extldflags "-static" -X github.com/gohugoio/hugo/common/hugo.buildDate="hogehoge"' \
> -o /go/bin/hugo main.go
> 
...
$ /go/bin/hugo version
Hugo Static Site Generator v0.55.6 linux/amd64 BuildDate: "hogehoge"

しかし、date コマンドで取得した値をそのまま渡したのですが、色々と試しているなかで確認しづらかったのです。日本時間ではないためです。いま何時と聞かれても大体な時間もわかりません。

素直にロケールファイルをダウンロードさせれば良いものを、コマンドだけでやろうとしたものだから、探すのに手間取ってしまい、むしろ時間を食ってしまいますた。とほほ。

結局 Dockerfile の RUN は以下のような感じに落ち着きました。

Dockerfile
FROM gliderlabs/alpine:latest AS build

LABEL "MAINTAINER"="KEINOS https://github.com/KEINOS" \
      "URL"=https://github.com/KEINOS/Dockerfile_of_Hugo-Alpine \
      "ORIGINAL AUTHOR"="Johannes Mitlmeier <dev.jojomi@yahoo.com>"

RUN apk add --no-cache git gcc g++ && \
    git clone --branch stable https://github.com/gohugoio/hugo.git hugo && \
    cd hugo && \
    buildDate=$(TZ=-9 date -Iseconds) && \
    go build -a \
      --ldflags "-extldflags \"-static\" -X github.com/gohugoio/hugo/common/hugo.buildDate=${buildDate}" \
      -o /go/bin/hugo main.gohugoio && \
    /go/bin/hugo version

FROM keinos/alpine

COPY --from=build /go/bin/hugo /usr/local/bin/hugo

ENTRYPOINT ["/usr/local/bin/hugo"]

動作確認済み環境

  • Alpine Linux v3.9
$ docker run --rm alpine:latest cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.9.4
PRETTY_NAME="Alpine Linux v3.9"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
$ # Over masOS as a host
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.4
BuildVersion:	18E226

参考文献

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?