Hexoの時間の扱いについてわかったこと

納得がいかなくて色々と調べてみたところ、とても不思議な現象が起きていることがわかった。

date の読み込みは正しいのだが、UTCの時間のまま _config.yml に書いてある timezone の時間として時差が付加される。

具体的に Hexoの日付処理の挙動が意味不明 という記事は date の値として 2017-09-27T00:18:03-07:00 を指定しているが、出力時に日付を詳細に表示してみると 2017-09-27T07:18:03+09:00 となる。

時間としては 2017-09-27T07:18:03+00:00 となるのが正しい。

ただ、何故かURLの日付は「26」を示していた。

これは、ファイルを生成する時に、26日として認識している、ということだ。

つまり、表示に使用している時間を元にしてファイルを生成しているのだろう。

Hexo のソースコードを見ていると気になったコードがあった。

1
2
3
4
5
6
7
8
9
10
exports.timezone = function(date, timezone) {
if (moment.isMoment(date)) date = date.toDate();
var offset = date.getTimezoneOffset();
var ms = date.getTime();
var target = moment.tz.zone(timezone).offset(ms);
var diff = (offset - target) * DURATION_MINUTE;
return new Date(ms - diff);
};

せっかくの momentjs のオブジェクトを JS の Date オブジェクトに変えている?
ここは普通に考えて momentjs の方へ処理をまとめるべきでは?

中国はタイムゾーンが一つだった

Hexo は中国発のソフトウェアということだ。

中国はあれだけ広いので、複数のタイムゾーンがあるだろう、と勝手に思っていた。

つまり、 Hexo はタイムゾーンについての考慮がされていると思っていた。

これはちゃんと調べてなかったのも悪かったけど、中国はあれだけ広いのにタイムゾーンが一つしかないようだ。

色々と衝撃だ。

タイムゾーンの処理を任せてみる

上記の timezone は、調べた範囲では、設定で指定している時だけに実行されている。

それならば、ということで、 timezone の指定をやめてみた。

すると、これまでよりはマシになった。

まず、パーマリンクが UTC の日付になった。ファイルとURLが一致するようになった。

これまで、23日なのに22日扱いになっていたりしたファイルなどが思っている日付になるようになった。

しかし、表示に使う時間はやはりおかしい。

具体的には 2017-09-27T00:18:03-07:00 という指定が 2017-09-27T07:18:03-07:00 のようになる。

やはりこういう場合は、正しく 2017-09-27T07:18:03-00:00 として認識されて欲しい。

ただ、元々詳細な時間までは表示されていないし、URLの問題は解決したので、ひとまずはこれで良さそう。