rcmdnk's blog

[オメガ]OMEGA 腕時計 スピードマスター デイト 3210.51 メンズ [並行輸入品]

以前、Octopressでサイトをbuildするときに 時間帯の地域をUTCにするようにしていたんですが、 Octopressをアップデート したらそれが効かなくなったのでその辺について。

Sponsored Links

時間帯地域の設定

それ程気にする所ではないんですが、 各ポストのyamlブロックのところで、

date: 2014-07-10 13:00

の様にするように日時を指定することで作成されたとされる日時を指定できますが 1、 Jekyllでbuildするときにコンピューターの地域を使って時間を設定します。 日本でやると上の時間が日本のものとして 2014-07-10 13:00 +9:00的な。

なので、海外とかに行ってbuildし直すと同じファイルでも この出力される日時が変わってしまいます。 (イギリスなんかでなら2014-07-10 13:00 +1:00みたいに。)

だからどうした、という感じもあるんですが、ちょっと気持ち悪いので、 常に指定時間はUTCのものである、ということになるように設定していました。

実際、上のdateの部分は、通常だとファイルを作った時に勝手に設定されますが、 ファイルを作った時と投稿する時が日付すらずれるときもあって書きなおしたりもするし、 あまり時間は重要でも無いので。 なので、このサイトを作るときには、さらにRakefileの中で、必ず12:00 になるように出力させています。

時間が重要になるのは同じ日に幾つかポストがある場合で、 この場合にはこの日時の順に投稿された、とみなされます(同時に始めてbuildしても)。 今日のこの一連の物も、一度作ってから 順番を考えてそれぞれ12:0013:0014:00みたいに時間をずらして 順番をつけています。

いずれにしろ、どこへ行っても同じ様になるように 時間帯を指定しておくのは良いと思います。 (もちろんUTCじゃなくてJSTでも良いんですが)

以前の方法: plugins/date.rb

以前は、時間のフォーマットをOctopressのplugins/date.rbで行っていました。 その中で、datetimeと言う関数があって、 これを使って日時にFilterをかけて表示していたので、 その関数内で

1
2
3
4
5
6
7
8
9
10
11
     def datetime(date)
       if date.class == String
         date = Time.parse(date)
       end
+      date = date.strftime("%Y-%m-%d %H:%M:%S")
+      cur_tz = ENV['TZ']
+      ENV['TZ'] = 'utc'
+      date = Time.parse(date)
+      ENV['TZ'] = cur_tz
       date
     end

的な感じでUTCに変換する様にしていました。

ただ、新しいOctopressではこのdate.rbが廃止されて 他からdatetimeなんかを持ってくる様になったので、他の方法が必要に。

jekyll-date-format.rb

plugins/octopress_filters.rb を見るとわかりますが、新しいOctopressでは、 jekyll-date-format というプラグインを代わり使っています(Octopressの作者のものなのでそちらに移行させた、という感じ)。

datetime関数などは jekyll-date-format-1.0.0/lib/jekyll-date-format.rb 2 の中で定義されています。

Jekyll 1.X or 2.X (+ Octopress)でのCategoryの取り扱い でやったようにこれをpluginsにコピーしてきて変更すれば良さげではあります。

で、実際に変更してみると上手く行きません。 どうも、同時に呼ばれているdate_to_xmlschemaというフィルター 3 がさらにJTSに戻してしまっている模様。

結果的に、一度無理やりUTCで12:00とかにしているので、出力は21:00+9:00とかになってしまいます。。。

以前もdate_to_xmlschemaは使っていたので、ここも変更があった様。

こちらはJekyllの中で定義されています(jekyll-2.0.3/lib/jekyll/filters.rb)。

こちらも持ってくれば良いといえば良いのですが、余りに面倒な感じになってきたので 他の方法を探すことに。

ENV[‘TZ’]をUTCで固定してしまう

以前の方法では一度ENV['TZ']をUTCにした後に律儀に元に戻していますが、 基本的にすべての場所でこれをしたいわけなので、 一度どこかで変更してそのままにしておけば良いだけ、ということに。

例えば、plugins/octopress-filter.rbの先頭に

ENV['TZ'] = 'utc'

と書いておくだけでもいけました。

ただ、これだと順番が重要になってどこに於けばよいのか曖昧。

コマンドを呼ぶときに設定

ちょっと探したらこんなのが見つかりました。

Force Octopress/Jekyll to use a specific time zone - Tim Taubert

$ TZ=UTC rake generate

の様に、環境変数設定をしておくとrubyの中でのENVとして使われる様です。

ただ、これだと毎回これを加えるか余計なexportをしなくちゃいけなくてチョット嫌な感じ。

Rakefileの中で設定

通常の環境を汚さないために、 Rakefileの中で

Rakefile
1
2
3
4
5
 puts "## Generating Site with Jekyll"
 system "compass compile --css-dir #{source_dir}/stylesheets"
+ENV['TZ'] = 'utc'
 system "jekyll build"
 system "rm -f .integrated"

みたいにjekyllコマンドを呼ぶ前にENVを設定することも可能。

ただ、これだと、きちんとやろうとするとpreviewとかすべての場所に追加しなきゃいけないので これもチョット面倒 4

_config.yml

と、色々やっていた所、Jekyllの設定で簡単にできることが分かりました。。。

Configuration

_config.ymlの中で

timezone: UTC

の様にtimezoneを指定してあげれば良いだけ。 (多分前にはなかった、はず。。。)

ということで、色々おかしな手間をかけずともこれをするのが 一番正しく簡単な方法です。

Sponsored Links
  1. dateの値がない場合にはファイル名から日時が採られます。

    Octopressのgenerate_onlyをモット便利に

  2. Macだと /Library/Ruby/Gems/2.0.0/gems/jekyll-date-format-1.0.0/lib/jekyll-date-format.rbとか

  3. octopress/.themes/classic/source/_includes/post/date.html

  4. ただ、最終的に投稿する所以外は全くどうでもよいと言えばどうでもよいので generateのところだけやっておけば別に問題ないわけですが。

    そうでなくても、地域を変数にして一箇所で変えられるようにして、後は一度書けばよいだけですが。。。。

Sponsored Links

« Jekyll 1.X or 2.X (+ Octopress)でのCategoryの取り扱い [email protected] »