JavaScriptのDateオブジェクトを拡張してPHPのdate関数を実装
某勉強会のグループチャットにて、『JavaScriptでXMLを取得、パースして適当に表示しなさい』と言う宿題が出た時、ちょっと欲しいなぁと思ったので勉強がてら作ってみました。
一応date関数に対応する全てのフォーマット文字列が使えますが、タイムゾーン周りを正確に実装するのは実質不可能なので、eは「Asia/Tokyo」、Tは「JST」固定になっています。
その他、副産物で日付周りのメソッドも色々生えてるので、良かったら使ってみて下さい。
目次
ダウンロード
php_date.js - 圧縮版 - v0.2.0
- 2009-09-09 - v0.2.0 - パース部分を大幅に書き換え
- 2009-08-26 - v0.1.2 - パース部分を修正
- 2009-08-25 - v0.1.1 - パース部分を修正
- 2009-08-19 - v0.1.0 - 公開
簡単な使い方
date関数風に使う基本
インスタンス化したDateオブジェクトのformatメソッドを使ってdate関数風にフォーマット。
var obj = new Date;
alert(obj.format('Y-m-d H:i:s'));
// 2005-08-15 15:52:01
定数を使う
定義済みの定数にある定数(っぽいモノ)も使えます。
var obj = new Date; alert(obj.format(Date.ISO8601)); // 2005-08-15T15:52:01+09:00 alert(obj.format(Date.RFC822)); // Mon, 15 Aug 05 15:52:01 +0900
日付文字列をパース
Date.parse()を拡張して、定数で定義されているフォーマットもパース出来るようにしました。
alert(Date.parse('2005-08-15T15:52:01+09:00'));
// 1124088721000
alert(Date.parse('Wed, 19 Aug 09 00:12:58 +0900'));
// 1250608378000
フォーマット文字列と同時にタイムスタンプもセット
formatメソッドの第二引数に ミリ秒単位のUNIXタイムスタンプ または Date.parse()でパース出来る日付文字列 をセットすることで好きな日時を出力できます。
var obj = new Date;
alert(obj.format('Y-m-d H:i:s', 1124088721000));
// 2005-08-15 15:52:01
alert(obj.format('Y-m-d H:i:s', '2009-12-20T18:32:31+00:00'));
// 2009-12-20 09:32:31
※セットした日時は日付を出力するまでの間のみ有効です。継続的に日付をセットしたい場合はsetTimeメソッドを使用して下さい。
以上、簡単な使い方でした。
APIドキュメント
JavaScript用のドキュメント自動出力ツールJsDoc Toolkitを使ってAPIドキュメントを作成してみました。しかしJsDoc Toolkitはあんまりメジャーじゃないっぽいですね。
詳しくはAPIリファレンスをご覧下さい。
利用シーン
作っておいて何ですが、JavaScriptでガッツリ日付処理する事ってあんまり無いですね。
便利ですね!
使わせて頂いてます。
どうやらOperaの10あたりからDate.parseが正常になったようで、そのままだとOpera10でエラーが出ちゃいました。
下記のように修正することで回避できましたので、ご連絡致します。
115行目@php_date.js
// OperaはDate.parseが変なので取り敢えずNaNにする
//var time = window.opera ? NaN : Date.__parse(dateString);
var time = (window.opera && parseFloat(opera.version())<10) ? NaN : Date.__parse(dateString);
139行目@php_date.js
// Opera かつ timeがNaNならDate.parseを通す
//return window.opera && isNaN(time) ? Date.__parse(dateString) : time;
return (window.opera && parseFloat(opera.version())<10) && isNaN(time) ? Date.__parse(dateString) : time;
ご報告&お使いいただきありがとうございます :)
Opera10でエラーが出る件ですが、手元の環境ではエラーを発生させる事が出来ませんでした。
よろしければ、エラーが出た時の状況をお教えいただけないでしょうか。
また、エラー検証の際に時差適用時のバグを発見し、修正する事が出来ましたので、合わせてお礼申し上げます :)