Dateクラスの便利なところ
日付や時間を扱うときに利用するDateクラスは本やサンプルでは主に取得につかわれることが多いような気がします。自分も、主にローカルタイムの取得にしか使っていませんでした。
冷静に考えると、かなり初歩的な機能なので、ご存知の方も多いのかもしれませんが、お恥ずかしながら個人的に盲点だった使い方を書いてみます。
簡単にいうと日付を計算する関数
昔懐かしいCGIPerlなどの本には、カレンダーを生成したりするときに曜日やうるう年を自力で計算するアルゴリズムが載っていたものですが、そういうふうに直感的にやると年月日時間の各値を取り出した後に計算とかかなり面倒なことをしてしまいそうになります。
時間のインクリメントはまだしも、日付となると月ごとの日数やうるう年のことを考えると大変頭が痛い計算になりますが、これをDateクラスが簡単に解決してくれました。
var today :Date = new Date( 2008, 0, 31 );
trace( today );
today.time += 24*60*60*1000;today.setDate( today.getDate()+1 ); // 一日分のミリ秒
trace( today ); // 2月1日になってるはず
ということなので、カレンダーを生成するときには基準となる日付でDateインスタンスをつくりtime値を1日分ずつ増やしていけば曜日や月の繰り上がりを気にせずシンプルに書くことができます。
var newyear:Date = new Date( 2008, 0, 1 ); var dayLength :Number = 24*60*60*1000; var dateList :Array = []; dateList.push(newyear); for( var i=0; i<364; ++i ) { var date :Date = new Date(newyear.time + i*dayLength); dateList .push( date ); }
数としてのDateインスタンス
また、Dateインスタンスが1つあれば日付の計算用に(yearとかmonthとかdayとか)いくつも変数をつくる必要がありません。
もたとえば、時計のようなシンプルな実装でも、一時的に使うだけでなく裏側ではDateクラスで計算をして、その結果を見た目に反映するようにつくっておくと、何かとラクだと思います。
つまり、日付を取得するだけでなく、ある種の数として扱えると捕らえるとわかりやすいと思います
function add15Minutes() { this.date.time += 15*60*1000; // 15分進める updateView(); } function updateView() { hour_txt.text =this.date.getHours(); minute_txt.text =this.date.getMinuts(); second_txt.text =this.date.getSecondas(); }
livedocsやAS本にはなかなかこういった概念的な見方をする解説がないのですが、単に機能的なことだけでなく作法や考え方まで含めた解説が増えてくれるといいんですけど。
ちなみに、AS3の場合、timeをNumberとして計算しないとうまくいきませんでした。
こちらが操作している値自体はintでもいけそうなんですが内部的にダメっぽいですね。
(追記)
社内のPGからツッコミが入ったので訂正。
らしいので、たまに閏秒あるので、「24*60*60*1000」が 必ずしも1日分の秒数とは限りません。
today.setDate( today.getDate()+1 );
とかするのがいいそうです。