Drupalの日付と時間

このブログの日めくりカレンダー風の日付表示は、記事の投稿日をDrupalの関数で年、月、日、曜日に分解してそれぞれをマークアップしてしています。例えば曜日はformat_date($node->created,'custom','l')で抽出できます。

$node->createdはそのまま出力すると「木曜日,6月 9,2011 - 18:10 +9:00」とかになっていて、Long、Midium、shortの設定毎にフォーマットを選べるものの、基本的には「Thursday, June 9,2011」といった表記の順番に沿っているので、日本語のサイトには適しません。年表示から始まるフォーマットもありますが、それでも「2011 6月 9」になってしまいます。Juneの訳は6月なので月を含めてくれますが、9は9日になってくれません。

そこで、Dateモジュールを導入します。CCKやViews並みの必須モジュールです。これで、独自に日付や時刻のフォーマットを設定できるようになります。PHPのDate Manualに沿ってフォーマットを作ります。Y年n月j日で「2011年6月9日」となるはずですが、これだと「2011年6月9日 年月日」と表示されてしまいます。

自分自身、随分長い間この問題は解決できておらず、Y/n/jとかでごまかしていたのですが、この記事にもあるように、Drupal7でもやはり解決は簡単ではなさそうです。

このためどうしても6月9日とかで表示したい場合は、最初に書いたformat_date関数でバラバラにして、月や日を表示しています。

日付は投稿日だけじゃなくて、イベント紹介のサイトとかではそのイベントの開催日とかがポイントになります。こういった投稿日以外の日付はDateモジュールでCCKのフィールドを作ることで組み上げていきます。

ポップアップカレンダーから簡単に日付設定でき、Calendarモジュールと組み合わせると、スケジュールカレンダーができあがります。

ところが、このフィールド値$node->field_date(dateはフィールド名)にfomat_date関数を使っても機能しません。数値のもたせ方が違うようです。

今度はPHPのstrtotime関数を使ってみました。OK読み込んでくれました。がっ、何か、おかしい、日付だけじゃなくて、時間も取り出すと入力した時間と出力した時間がずれています。9時間ずれていて、どうやらGMTからの時差をサイトのタイムゾーン設定に合わせてはくれないようです。

さんざん色んな方法を試して、漸く行き着いたのが、日付のフォーマットを年、月、日の数値だけにして、別々のカスタムフォーマットを作り、それぞれをViewsで呼び出して、それに出力のリライトで年、月、日の文字を追加、という方法でなんとかしのげるようになりました。

他にももっとスマートな方法があるはずですが、とりあえず解決、日付の表示だけで、ほぼ24時間くらいかかってしまいました・・・