読者です 読者をやめる 読者になる 読者になる

SimileのTimelineが、タイムゾーンが正の場合に正しく動作しない。

JavaScript 未解決

柔軟にカスタマイズできて、とてもいいアプリケーションだと思うのだけれど、今のところJSTでちゃんと動かないみたい。

TimeZoneを+9に設定すると、たとえば月のラベルに12月が2回表示されたりする。



以下の手順で確認した。

  • 4/18現在の最新版をチェックアウト。
$ svn export http://simile.mit.edu/repository/timeline/trunk/ timeline
  • src/webapp/examples/monet ディレクトリを jsttest という名前でコピー。
  • monet.htmlを開いて、BandInfoにtimeZone: +9を追加。intervalUnitをDECADEからMONTHに。
            var bandInfos = [
                Timeline.createBandInfo({
                    timeZone: +9, // ←ここ!
                    width:          "10%", 
                    intervalUnit:   Timeline.DateTime.DECADE, 
                    intervalPixels: 200,
                    date:           d,
                    showEventText:  false,
                    theme:          theme
                }),
                Timeline.createBandInfo({
                    timeZone: +9, // ←ここ!
                    width:          "90%", 
                    intervalUnit:   Timeline.DateTime.MONTH, // ←ここ!
                    intervalPixels: 200,
                    eventSource:    eventSource,
                    date:           d,
                    theme:          theme
                })
            ];
  • ブラウザで表示。手元の環境では、右に進んでいくと1871年の3月が2回表示される!
  • ラベルを書き換えて、月のラベルを日と時間まで表示してみる。monet.htmlのスクリプト冒頭に以下を追加。
Timeline.TestLabeller = function(locale, timeZone) {
    var o = new Timeline.GregorianDateLabeller(locale, timeZone);
    o.labelInterval = Timeline.TestLabeller._labelInterval;
    return o;
};
Timeline.TestLabeller._labelInterval = function(date, intervalUnit) {
    var dateStr = (date.getUTCMonth() + 1) + "/" + date.getUTCDate() + " " + date.getUTCHours() + ":" + date.getUTCMinutes();
    return { text: dateStr, emphasized: false };
};
  • bandInfosの定義の下に以下を追加。
bandInfos[1].labeller = new Timeline.TestLabeller(bandInfos[1].locale,bandInfos[1].timeZone);

すると、ロード直後のラベルが1/2 15:00になっている。右に行くと、2/28 15:00のように月末の日付がLabellerに渡されていることがわかる。これが、同じ月が2度表示される直接的な原因だと思う。

timeZoneの指定を外すと、ラベルの表示は1/1 0:00になる。これは正しい。

timeZoneを負の値、例えば-9に変えると、1/1 9:00とGMTらしい日付が表示される。移動しても1日の9時で安定している。これも正しい。


とりあえずTimezoneを設定するのをやめて、入力するデータもGMTに変えてしまえば回避はできそう。