[AS3] Dateインスタンスに設定した月が1増える [Edit]

Dateインスタンスに月を設定して調べると、なぜか設定した値より1増えてしまうことがあります。

var my_date:Date();
my_date.month = 1;
trace(my_date.month);   // 出力は2となることがある

確実に再現するには、つぎのフレームアクションを試します。

var my_date:Date = new Date(2010, 0, 31);
my_date.month = 1;
trace(my_date.month, my_date.date);   // 出力: 2 3

Date.monthプロパティは、1月の0から始まる整数値です。つまり、生成したDateインスタンスには、1月31日が設定されています。その後、Date.monthプロパティに1つまり2月を設定すると、値が勝手に2つまり3月になってしまいます。

ただ、Date.dateプロパティの示す日の値が3になっていることに注目しましょう。これは、2010年の2月は28日が月末ですので、31日までの3日分が繰上がって3月3日になってしまったのです。

ActionScript 2.0では、気を利かせて月末に直してくれるようです。なお、ActionScript 2.0では、Dateクラスに上記のプロパティはありませんので、Date.setMonth()Date.getMonth()およびDate.getDate()メソッドを用います。

var my_date:Date = new Date(2010, 0, 31);
my_date.setMonth(1);
trace([my_date.getMonth(), my_date.getDate()]);   // 出力: 1,28

もっとも、JavaScriptで試すと、ActionScript 3.0と同じように3日繰上がります。したがって、この仕様変更はECMAScriptに則ったものといえそうです。

なお、ActionScript 3,.0でこの問題を避けるには、月だけでなく日も確実に設定することです。そのとき、Date.setMonth()メソッドを使うと、月と日を両方引数に渡せます。

var my_date:Date = new Date(2010, 0, 31);
my_date.setMonth(1, 1);
trace(my_date.month, my_date.date); // 出力: 1 1

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事