サイトトップ

Director Flash 書籍 業務内容 プロフィール

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.