#1です
> ある日の午前0時に発売開始する商品があるとして、
> その日の時間までをフラッシュで表示したい
なるほど。そういうことですか。
その「ある日の午前0時」(仮) は,
サーバでもクライアントでも同じ時点を指しますよね。
今の時刻が2000年10月であっても2010年11月であっても「ある日の午前0時」は同じ時点を指します。
ですから,これは固定でFlash(クライアントサイド) でも求められます。
「今」は,
どこから見るか,いつから見るかによって変わりますから,
この「今」をサーバで決めた今にするということですよね。
ActionScript 3.0 で
Flash フレーム1 のスクリプトだと
こんな感じでできると思います↓
----------------------
//テキストフィールドを作成
var time_txt:TextField = new TextField();
time_txt.autoSize = TextFieldAutoSize.LEFT;
addChild(time_txt);
//ゴール時刻を2010年11月20日13時とする
var goal_date:Date = new Date(2010,10,20,13,0,0);
//今のクライアント時刻を入れる変数
var now_date:Date;
//キャッシュ参照対策用
now_date = new Date();
var now_time:Number = now_date.getTime();
//サーバ時刻との差を入れる変数
var dif_time:Number;
//PHPへのパス(キャッシュ参照対策入り)
var php_url:URLRequest = new URLRequest("time.php" + "?t=" + now_time);
//PHPのローダー
var php_ld:URLLoader = new URLLoader();
//PHPロード時に関数onLoadCompを実行
php_ld.addEventListener(Event.COMPLETE, onLoadComp);
//PHPをロード
php_ld.load(php_url);
//関数onLoadCompの定義
function onLoadComp(evt:Event):void {
//今のクライアント時刻
now_date = new Date();
//サーバとクライアントの1970/1/1からの経過ミリ秒の差
dif_time = Number(evt.target.data) - now_date.getTime();
//毎フレーム関数countDownを実行
addEventListener(Event.ENTER_FRAME,countDown);
}
//関数onLoadCompの定義
function countDown(evt:Event):void {
//今のクライアント時刻
now_date = new Date();
var sec:Number = (goal_date.getTime() - now_date.getTime() - dif_time)/1000;
time_txt.text = "あと " + String(Math.round(sec)) + "秒";
}
----------------------
キャッシュ参照対策を入れていますから
このままではムービープレビューでは動作しないと思います。
SWF と HTML をパブリッシュした上で
「time.php」 が 1970年1月1日からのミリ秒を出すようにして
HTML をブラウザで見たら「あと○○秒」が表示されると思います。
「ある日の午前0時」(仮) は Flash 内で固定的にしていますが,
サーバで変えてその変えたデータもロードするようにしても良いと思います。
※それと
他プログラム言語でも同じですが
月の数 は 日本人的数え方 とは 1 ずれます。
日本人の1月はプログラムでは0の月になります。
12月は11の月です。
お礼
実際に動かしてみたのですが、時間は表示されるのですが、おおよそ見当がつく時間とはかけ離れた時間が表示されてしまいました。 そこで色々調べてみたのですが、下記URLページを見てスクリプトを変更するとうまく動いてくれました。 http://1ft.cbass.jp/blog/2008/07/000037.html ------------------------------------------------ //サーバとクライアントの1970/1/1からの経過ミリ秒の差 dif_time = Number(evt.target.data) - now_date.getTime(); ↓ dif_time = Number(evt.target.data)*1000 - now_date.getTime(); ------------------------------------------------ 私はこれで大丈夫だと思うのですが、念のため報告させていただきました。 あと、ひとつ疑問に思ったのですが、フラッシュで1秒というのはどうやって認識してるのでしょうか? 例えばフレームレートが12だったら12フレームいったら1秒ということですよね。 このカウントダウンのスクリプトはフレームレートに関係なく1秒でカウントダウンしてるのですが、これはどうやって1秒と認識してるのでしょうか。 色々と申し訳ありませんが、宜しくお願い致します。
補足
丁寧なご回答ありがとうございます。 勉強不足なところもありますので、かわらない部分等あるとは思いますが、ひとつひとつじっくり実践していきたいと思います。 ありがとうございました。