概要
タイムラインページで、ブログ記事とつぶやきの並び順が正しくない問題を修正した。具体的には、18:05:42に投稿されたブログ記事が、10:09:03に投稿されたつぶやきよりも下に表示されていた。新しい投稿が上に来る降順ソートのはずなのに、古いつぶやきが先に表示されていた。
原因
タイムライン上の各エントリ(つぶやき、ブログ記事など)は、並び替え用のタイムスタンプ(sortTimestamp)という数値を持っている。この数値が大きいほど新しい投稿として扱われ、タイムラインの上部に表示される。
問題は、つぶやきとブログ記事でこのタイムスタンプの計算方式が異なっていたことにある。
つぶやきの場合
つぶやきは「10:09:03」という時刻をそのまま数値に変換していた。内部的にはUTC(協定世界時)として扱われるため、「10:09:03 UTC」に相当するタイムスタンプが生成されていた。
ブログ記事の場合
ブログ記事は「18:05:42」という時刻をJST(日本標準時、UTC+9)として正しく解釈し、9時間を差し引いて「09:05:42 UTC」に相当するタイムスタンプを生成していた。
結果
比較すると 10:09:03 UTC > 09:05:42 UTC となるため、ソート時に古いつぶやき(10:09:03 JST)が新しいブログ記事(18:05:42 JST)より先に表示されてしまっていた。
つまり、つぶやきは「JSTの時刻をそのままUTCとみなす」方式、ブログ記事は「JSTからUTCへ正しく変換する」方式を使っており、この不整合がバグの原因だった。
修正内容
1. タイムスタンプ計算方式の統一
ブログ記事のタイムスタンプ計算を、つぶやきと同じ方式に統一した。具体的には、ブログ記事の日時文字列(JST)をparseDateToTimestamp()関数で変換するようにした。これにより、つぶやきもブログ記事も同じタイムゾーン基準で比較されるため、正しい時系列順で表示される。
2. 合成カードのタイムスタンプ統一
イベント期間中に表示される「戦果カード」などの合成エントリも、同じparseDateToTimestamp()関数でタイムスタンプを生成するように変更した。以前はnew Date("T形式")を使用しており、実行環境のタイムゾーン設定に依存していた。
3. 最終ソートの追加
全エントリの組み立てが完了した後に、もう一度全体を降順ソートする処理を追加した。これにより、安全ネット機能で後から追加されたエントリも含めて、常に正しい時系列順が保証される。
再発防止
今回の修正では「タイムスタンプの計算方式を全エントリで統一する」というアプローチを採用した。また、最終ソートを追加することで、今後エントリの追加処理が変更されても並び順が壊れないようにした。