Bloggerで投稿日付を全ての記事に入れる方法 (data:post.dateHeader編)
ですが、 他にも<data:post.timestampISO8601/>を使って対処する方法があります。
ちょっと手間はかかりますが、書きようによってはいろんなフォーマットで日付を表示できるようになります。
ちなみに<data:post.timestamp/>でも日付の表示ができますが、こちらは表示形式を変更できてしまうため、Javascriptで処理するのにあまり向きません。<data:post.timestampISO8601/>ならW3CDTF形式なのでパースが楽です。
なお、実装するにあたって、jQueryを使用しています。
jQueryは使用しなくても実装できますが、作業が楽になるのでぜひ使ってみてください。
テンプレートに
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js' type='text/javascript'/>を追加するだけで、jQueryが使えるようになります。
それでは、実装手順です。
テンプレートを修正する
まず、テンプレートを以下のように変更します。修正前 (Simpleテンプレートより)
<b:if cond='data:post.dateHeader'> <h2 class='date-header'><span><data:post.dateHeader/></span></h2> </b:if>
修正後
<h2 class='date-header post-timestampISO8601'> <span><data:post.timestampISO8601/></span> </h2>
これで全投稿にW3CDTF形式の日付フォーマットで日付が表示されるようになります。
このままだと、yyyy-mm-ddThh:mm:ss+hh:mmみたいな日付になり、見にくいので以下のJavascriptで見やすいように処理してあげます。
テンプレートにJavascriptコードを追加する
head要素内の適当な場所に以下のコードを記述します。このコードは、W3CDTF形式の日付フォーマットからDateオブジェクトを生成して返すメソッドです。
<script type='text/javascript'> //<![CDATA[ // ------------------------------------------------------------------------ // parseIso8601 // Creates a new Date object from W3CDTF-like date format string. // // iso8601Time: A string, W3CDTF-like format (yyyy-mm-ddThh:mm:ss+hh:mm) only. // ------------------------------------------------------------------------ function _parseIso8601(iso8601Time){ var reIso8601 = /(\d{4})-(\d{2})-(\d{2})([T ])(\d{2}):(\d{2}):(\d{2})([+-])(\d{2}):(\d{2})/; return function(iso8601Time){ if(iso8601Time != null){ var r = reIso8601.exec(iso8601Time); if(!r){ return new Date(iso8601Time.substring(0, 10)); } var dt = new Date(); dt.setUTCFullYear(Number(r[1])); dt.setUTCMonth(Number(r[2] - 1)); dt.setUTCDate(Number(r[3])); dt.setUTCHours(Number(r[5])); dt.setUTCMinutes(Number(r[6])); dt.setUTCSeconds(Number(r[7])); return (new Date(dt.getTime() - ((((Number(r[9]) * 60) + Number(r[10])) * 60) * 1000))); }else{ return null; } } } var parseIso8601 = _parseIso8601(null); //]]> </script>
ここまでで準備は終わりました。
次のJavascriptコードで、W3CDTF形式の日付を任意のもの(この場合は、YYYY年MM月DD日 N曜日)に変換できます。こちらのコードもhead要素の適当な場所に記述してください。
ちなみに、この部分でjQueryが使われています。
簡単に部分的な説明すると、$(document).readyがDOM構築時に処理されるメソッドで、$("...").eachが合致する要素に対して繰り返し処理を行うメソッドです。
<script type='text/javascript'> //<![CDATA[ (function(){ // -------------------------------------------------------------------------------- // This function calls necessary events functions to execute // when the DOM object is fully loaded. // But those events do not get triggered until all assets such as // image have been completely received. // -------------------------------------------------------------------------------- $(document).ready(function() { var dateFormat = ["年", "月", "日"]; var weekFormat = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]; $(".post-timestampISO8601 span").each(function(i) { var timestampIso8601 = $(this).html(); if(timestampIso8601 != null) { var dd = parseIso8601(timestampIso8601); if(dd != null){ var ds = dd.getFullYear() + dateFormat[0]; ds += (dd.getMonth() + 1) + dateFormat[1]; ds += dd.getDate() + dateFormat[2]; $(this).html(ds + " " + weekFormat[dd.getDay()]); } } }); }); })(); //]]> </script>
以下の部分が、日付を文字列で作って書き換えている部分となります。
var ds = dd.getFullYear() + dateFormat[0]; ds += (dd.getMonth() + 1) + dateFormat[1]; ds += dd.getDate() + dateFormat[2]; $(this).html(ds + " " + weekFormat[dd.getDay()]);
以上で終わりです。
0 件のコメント:
コメントを投稿