|
Macromedia Flash非公式テクニカルノート
Date.setMonth()の設定値が正しくない
ID: FN0610001 |
Product: Flash |
Platform: All
Version: 8.0 and 7.0
問題
月末近くの日付をもったDateインスタンスに対してDate.setMonth()メソッドを用いると、正しい値に設定されないことがあります。たとえば、以下のスクリプト001で、つぎのような出力が得られる場合です。
スクリプト001■2006年1月31日のDateインスタンスで月を2月に変更
// フレームアクション
// Flash Player 8または7/ActionScript 2.0書出し
var _date:Date = new Date(2006, 0, 31); // 2006年1月31日のDateインスタンスを作成
_date.setMonth(1); // 月を2月に変更
trace(_date); // 出力: Tue Feb 28 00:00:00 GMT+0900 2006
|
2006年1月28日の月を2月にすれば、2月28日になります。したがって、2006年1月31日の月を2に変更した場合、そのさらに3日後である3月3日になるべきです。実際、JavaScriptでは、そのような結果になります(スクリプト002)。
スクリプト002■JavaScriptで2006年1月31日のDateインスタンスの月を2月に変更
// JavaScript
var _date = new Date(2006, 0, 31);
_date.setMonth(1);
alert(_date); // 表示: Fri Mar 03 2006 00:00:00 GMT+0900 (JST)
|
原因
Flash Player 8および7のバグだと思われます。Flash Player 6あるいは5でパブリッシュすると、正しい値が得られます。また、Flash Player 9では、修正されているようです[*1]。
[*1] 下位互換性が維持されますので、Flash Player 9で再生するだけでは足りず、Flash Player 9でパブリッシュしなければなりません。Flash Player 9に書出せるFlashオーサリングツールは、Flash Professional 9 ActionScript 3.0 Previewでバブリックアルファの段階です。商用コンテンツをFlash Player 9でパブリッシュするには、Flex Builder 2を用いる必要があります。
|
対処法
Date.setMonth()メソッドを使わず、Dateクラスのコンストラクタ関数を使って、新たにインスタンスを生成すれば、正しい値が設定されます。
つぎのスクリプト003はDate.setMonth()メソッドの代替となるfunction(関数)を定義します。関数にDateインスタンスと月の数値を引数として渡すと、月のみ新たな値に設定された新規Dateインスタンスを返します。
スクリプト003■Date.setMonth()を代替する関数の定義
// タイムライン: _root
// フレームアクション
var _date:Date = new Date(2006, 0, 31);
_date = xSetMonth(_date, 1);
trace(_date);
function xSetMonth(_date:Date, nMonth:Number):Date {
// インスタンスの日付と時刻の値を取得
var nYear:Number = _date.getFullYear();
var nDate:Number = _date.getDate();
var nHours:Number = _date.getHours();
var nMinutes:Number = _date.getMinutes();
var nSeconds:Number = _date.getSeconds();
var nMilliSeconds:Number = _date.getMilliseconds();
// 月のみ引数の値に設定した新規Dateインスタンスを作成
var return_date:Date = new Date(nYear, nMonth, nDate, nHours, nMinutes, nSeconds, nMilliSeconds);
return return_date;
}
|
作成者: 野中文雄
作成日: 2006年10月7日
Copyright ©
2001-2006 Fumio Nonaka. All rights reserved.
|