※(2007/06/21修正)日付フォーマットが元に戻ったようなのでこのエントリーは不正確な情報となりました。
twitter javascript badge のカスタマイズネタを随分と書いていますが、今日トップページに張ってある badge の日付表示がおかしいので、 badge 内で使用されている user_timeline の json の中身を確認してみました。
すると、あろう事かつぶやき日付(項目名:created_at)のフォーマットが変わっていました。
旧)"Wed Apr 25 12:35:05 +0000 2007" 新)"06/19/2007 12:49:33 UTC"
おいおい、随分と変わったな。public_timelineとかfriends_timelineとかも変わったっぽいので、各種マッシュアップアプリケーションにも影響でるんじゃないか?
javascript badge の対処法
変更されたフォーマットを見ると、むしろJavaScriptが処理しやすいフォーマットになりました。”UTC” の記述もあるので、ブラウザが時差も判断してくれます。
つ・ま・り・前に対応したIE表示不具合の対応は必要なくなりました。
ってか、むしろ例のハックをやめないとうまく表示できません。
下記を参考にして下さい。
function relative_time(time_value) { //削除 //time_values = time_value.split(" "); //time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3]; var parsed_date = Date.parse(time_value); var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); //削除 //delta = delta + (relative_to.getTimezoneOffset()*60); if(delta < 60) { return 'less than a minute ago'; } else if(delta < 120) { return 'about a minute ago'; } else if(delta < (45*60)) { return (parseInt(delta / 60)).toString() + ' minutes ago'; } else if(delta < (90*60)) { return 'about an hour ago'; } else if(delta < (24*60*60)) { return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago'; } else if(delta < (48*60*60)) { return '1 day ago'; } else { return (parseInt(delta / 86400)).toString() + ' days ago'; } }
それから、つい最近書いた下記エントリーも変更が必要です。
・第8回:Twitter JavaScript Badges の日付フォーマットを自由にカスタマイズ
function relative_time(time_value) { //削除 //time_values = time_value.split(" "); //time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3]; var parsed_date = Date.parse(time_value); var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); //削除 //delta = delta + (relative_to.getTimezoneOffset()*60); // 日付情報取得 var dt = new Date(); dt.setTime(dt.getTime() - (delta*1000)); yy = dt.getYear(); mm = dt.getMonth() + 1; dd = dt.getDate(); dy = dt.getDay(); hh = dt.getHours(); mi = dt.getMinutes(); ss = dt.getSeconds(); if (yy < 2000) { yy += 1900; } if (mm < 10) { mm = "0" + mm; } if (dd < 10) { dd = "0" + dd; } dy = new Array("日","月","火","水","木","金","土")[dy]; if (hh < 10) { hh = "0" + hh; } if (mi < 10) { mi = "0" + mi; } if (ss < 10) { ss = "0" + ss; } // フォーマットして返す return yy+"/"+mm+"/"+dd+"("+dy+") "+hh+":"+mi+":"+ss; }
という感じ。
何だか、そこはかとなくむなしい気分ですが。
みなさん参考にしてください。
それから、今後もこういった微妙な仕様変更はあるかもしれないので注意が必要ですね。
新しいシステムはどんどん変更されていくもんなんですね〜。
ちょっと前にeditaもログインしたらあまりの変わりようにびっくりしましたもんね。(笑)
twitterのことちょこっとだけ書いたのですが、その際にyagerさんのお名前もちょこっとだけ書いちゃいました、リンクつきで。(笑)
>ゆうさん
機能追加ならまだしも仕様変更はちょっとやり方を考えないとまずいですけどね。
APIみたいなものは仕様が命ですから、いきなり変えたりするとすごい範囲に影響します。
ま、今回の件は多分バグか、あまり深く考えずに「やっちゃった」感じかもしれません。
リンクありがとうございます。twitter始めたらaddして下さいね。