dポイントプレゼントキャンペーン実施中!

Flash lite1.1で、あるイベント日(3月3日12時00分)までの日数を「あと○○日」という形でカウントダウン表示させたいと思っています。

2月25日には「あと6日」
2月26日には「あと5日」


というように。
またカウントの切り替わる時間は12時00分に統一したいです。

http://oshiete1.goo.ne.jp/qa863385.html
↑ここの回答を見ながら作ってみたのですが、Flash lite1.1ではエラーが出てしまい上手くいきませんでした。
Flash lite1.1で動作させる為にはどうすればよいのでしょうか?
いろいろ試してみたのですがどうしても分かりません。
どなたか教えていただけないでしょうか?

A 回答 (1件)

日数の計算は年・月ごとに日数が異なるため、数値の演算のように単純に計算することができません。


しかし、基準を決めて、そこからイベントの日までの日数と現在までの日数を算出すると、両者は同じ基準から見た日数になり、容易に差分を求めることができます。

No.863385 の#2の作例では、1970 年1月1日0時0秒を基準としてイベントの日までの時間と現在までの時間を求め、この差分を日数に直しています。
1970 年1月1日を基準にする理由は、Date クラス(古い Flash ではオブジェクト)という日付や時刻を扱うクラスが持っている機能で 1970 年1月1日から指定の日時までの経過時間を取得できるからです。

しかし、Flash Lite 1.1 には Date クラスやこれと同等の機能の関数がありません。
同じ発想で考えるならば、別の基準が必要になります。


日数単位の計算でしたら、グレゴリオ暦の特徴を活かした様々なアルゴリズムが考案されています。
他にも、ユリウス暦を使って求める方法などもあるそうです。

ActionScript の作例ではないのですが、現在の年月日とイベントの年月日だけで計算できる(配列変数も不使用)アルゴリズムがありました。
年に満たない分の日数を配列変数を使わずに求める部分が理屈っぽい話になっていますけれど、よろしければご参照ください。

 ・ ++C++; // 未確認飛行 C:
  経過日数の計算(アルゴリズムとデータ構造)
  http://ufcpp.net/study/algorithm/o_days.html

紹介されているプログラムはC#のものなので、Flash Lite では使えません。
Flash Lite 1.1 用に書き直すと、大体、次のようになりますでしょうか。
このスクリプトは、タイムラインのフレームに記述してください。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)


/*****************************************************/

 /////////////////////////////////////////////////////////////////////
 //初期設定
 /////////////////////////////////////////////////////////////////////

 //イベントの年月日
 event_y = 2009;
 event_m = 3;
 event_d = 3;

 //現在の年月日を取得
 today_y = fscommand2( "GetDateYear" );
 today_m = fscommand2( "GetDateMonth" );
 today_d = fscommand2( "GetDateDay" );


 /////////////////////////////////////////////////////////////////////
 //グレゴリオ暦1年1月1日からイベント日までの経過日数を求める
 /////////////////////////////////////////////////////////////////////

 //イベントの月が1月または2月の場合、前年の13月・14月として扱う
 if( event_m <= 2 )
 {
  temp_y = event_y - 1;
  temp_m = event_m + 12;
 }
 else
 {
  temp_y = event_y;
  temp_m = event_m;
 }

 //経過年を日に換算:とりあえず全て平年と見なして計算
 year_d = 365 * ( temp_y - 1 );

 //閏年の回数を算出
 leap_y = int( temp_y / 4 ) - int( temp_y / 100 ) + int( temp_y / 400 );

 //1月1日からイベントの月の1日までの日数
 adjust_d = int( ( temp_m * 979 - 1033 ) / 32 );

 //1年1月1日からイベントの年月日までの日数
 event_days = year_d + leap_y + adjust_d + event_d - 1;


 //////////////////////////////////////////////////////////////////
 //グレゴリオ暦1年1月1日から現在までの経過日数を求める
 //////////////////////////////////////////////////////////////////

 //現在の月が1月または2月の場合、前年の13月・14月として扱う
 if( today_m <= 2 )
 {
  temp_y = today_y - 1;
  temp_m = today_m + 12;
 }
 else
 {
  temp_y = today_y;
  temp_m = today_m;
 }

 //経過年を日に換算:とりあえず全て平年と見なして計算
 year_d = 365 * ( temp_y - 1 );

 //閏年の回数を算出
 leap_y = int( temp_y / 4 ) - int( temp_y / 100 ) + int( temp_y / 400 );

 //1月1日から現在の月の1日までの日数
 adjust_d = int( ( temp_m * 979 - 1033 ) / 32 );

 //1年1月1日から現在までの経過日数
 today_days = year_d + leap_y + adjust_d + today_d - 1;


 //////////////////////////////////////////////////////////////////
 //イベントまでの日数を求める
 //////////////////////////////////////////////////////////////////

 day_cnt = event_days - today_days;

/*****************************************************/


イベントの年月日を、変数 event_y ・ event_m ・ event_d に指定してください。上記の作例では 2009 年3月3日をイベントの日とし、現在からこの日までの日数を算出します。
最終的に、変数 day_cnt にイベント日までの日数が入ります。ダイナミックテキストなどに出力して、動作を確認してみてください。

シフト演算( >> 2 と >> 5 の部分)は Flash Lite 1.1 では使えないため、シフト演算の部分を除算に置き換えています。
スクリプトを書いたフレームと次のフレームをループするなどしてスクリプトが連続的に実行される構成にすると、閲覧中に日付が変わった時にも日数が減るようになります。


当方は Flash Lite 1.1 や Flash Player 4 の文法に詳しくないので、なんか鈍くさいことをやっているかもしれません ^^;
プレビューでの動作確認のみで実機では検証しておりませんが、ご参考までに。
    • good
    • 0
この回答へのお礼

ありがとうございます。大変分かりやすい説明です。さっそく試してみたいと思います。

お礼日時:2009/01/31 00:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!