SimileのTimelineが、タイムゾーンが正の場合に正しく動作しない。
柔軟にカスタマイズできて、とてもいいアプリケーションだと思うのだけれど、今のところ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に変えてしまえば回避はできそう。