Macromedia Flash非公式テクニカルノート

Date.getHours/Date.getUTCHoursが正しい数値を返さない

ID: FN0109007 Product: Flash

Platform: All
Version: 5.0r30

1. 現象
Windows版ではDate.getHoursメソッドの返す値が実際よりも1多く、Macintosh版ではDate.getUTCHoursの返す値が実際よりも1少ない数値になることがあります。

2. 原因
Flash Player 5.0r30のバグです。タイムゾーンが日本に設定されている環境で、夏時間が適用される期間に発生します。Flash Player 5.0r41/42以降では、改善されております。Macromediaテクニカルノート「Dateオブジェクトの不具合が改善されました」をご参照ください。

3. 対処法
夏時間が適用される期間内かどうかを判定して、戻り値を補正してください。

Dateオブジェクトの返す時間と協定世界時間との差を比較すると、夏時間が適用される期間かどうかを判別できます。夏時間の関係ない本来の時差は9時間です。ところが、上述のバグにより、夏時間の適用期間にはWindowsとMacintoshともに時差が10時間になります(バグの発生するメソッドは別ですが、いずれも時差を広げることになります)。そのため、時差が9時間でなければ、夏時間の適用期間であることになります。

また、バグを解消したFlash Player 5.0r41/42以降であれば、時差はつねに9時間になります。したがって、時差が9時間でない場合にのみ補正を適用すれば、Flash Player 5.0のビルドに関わらず、正しい値を得ることができます。

夏時間を判定する関数およびWindowsとMacintoshそれぞれについて、メソッドの値を補正するスクリプトのサンプルをご紹介します。主なステートメントの行っている処理は、コメントを加えてあります。また、使用しているメソッドやアクション・演算子等について、詳しくは「ActionScript辞書」をご参照ください。

// [夏時間を判定する関数]
function xIsDST (oDate) {
  //引数としてDateオブジェクトを受取る
  //取得した時間と協定世界時間の差が9になるかを判定
  //24を加えているのはマイナスの値になることを避けるため
  if ((oDate.getHours()-oDate.getUTCHours()+24)%24 != 9) {
    return true;
  //夏時間適用: trueを返す
  } else {
    return false;
  //夏時間適用外: falseを返す
  }
}

// [Windows用時間を補正する関数]
function xGetTrueHours (oDate) {
  //引数としてDateオブジェクトを受取る
  if (xIsDST(oDate)) {   //夏時間が適用されるかを関数によって判定
    return (oDate.getHours()+24-1)%24;   //夏時間の誤りを補正
  } else {
    return oDate.getHours();   //補正不要
  }
}

// [Macintosh用協定世界時間を補正する関数]
function xGetTrueUTCHours (oDate) {
  //引数としてDateオブジェクトを受取る
  if (xIsDST(oDate)) {   //夏時間が適用されるかを関数によって判定
    return (oDate.getUTCHours()+1)%24;   //夏時間の誤りを補正
  } else {
    return oDate.getUTCHours();   //補正不要
  }
}

//関数のテスト例
oNow = new Date();
trace (xGetTrueHours(oNow));   //Windowsの場合
trace (xGetTrueUTCHours(oNow));   //Macintoshの場合

4. Dateオブジェクトのメソッド定義
上級者向けのテクニックとして、前述3の関数をDateオブジェクトのメソッドとして定義するサンプルをご紹介します。'getVersion'関数でプラットホームを判定することにより、クロスプラットホームでの動作を可能としています。なお、'getVersion'関数は、「アクション」パネルで「エキスパートモード」から「ノーマルモード」に切換えると、()が削除されてしまいますのでご注意ください。

オブジェクトにメソッドを定義するには、'prototype'プロパティを用います。'prototype'プロパティについては、『ActionScriptリファレンスガイド』またはオンラインヘルプ「ActionScriptリファレンス」で「ActionScriptを使用したスクリプトの記述」の章の「カスタムオブジェクトの使用」の項をご参照ください。

//Dateオブジェクトへのメソッド定義
Date.prototype.isDST = xIsDST;
Date.prototype.getTrueUTCHours = xGetTrueUTCHours;
Date.prototype.getTrueHours = xGetTrueHours;
//夏時間を判定する関数
function xIsDST () {
  return (24+this.getHours()-this.getUTCHours())%24 != 9;
}
//Date.getUTCHoursメソッドの補正用関数
function xGetTrueUTCHours () {
  if (0<=getVersion().indexOf("MAC") && this.isDST()) {
    return (this.getUTCHours()+1)%24;
  } else {
    return this.getUTCHours();
  }
}
//Date.getHoursメソッドの補正用関数
function xGetTrueHours () {
  if (0<=getVersion().indexOf("WIN") && this.isDST()) {
    return (this.getHours()+23)%24;
  } else {
    return this.getHours();
  }
}
//関数のテスト例
oToday = new Date();
sNow = oToday.getTrueHours()+":"+oToday.getMinutes()+":"+oToday.getSeconds();
trace (sNow);

_____

作成者: 野中文雄
更新日: 2001年10月31日 説明を若干追加
更新日: 2001年9月20日 対処法の解説とスクリプトの若干の訂正
作成日: 2001年9月14日


© 2001 and beyond Fumio Nonaka All rights reserved.