• ベストアンサー

FLASHでのカウンターの残り日数を正確に表示できません

FLASH初心者です。わかりにくい説明かもしれませんが、よろしくお願いいたします。 http://oshiete1.goo.ne.jp/qa1192628.html こちらのページを参考にさせていただき、FLASHでカウンターを作成しました。 2010年1月16日をイベント日として、残り日数を表示させたいのですが、自分が作成したカウンターに表示される日数が正確なものではないようです。 自分でいろいろ試してみたのですが、2009年4月30日までは、正確に表示されるのですが、5月1日以降になると残日数がいきなり増えてしまいます。 下記に自分が作りました、カウンターのスクリプトを記しますので、間違いがありましたらご教示いただけますようお願いいたします。 //現在の日付および時刻を取得 yy = date_obj.getFullYear(); mm = date_obj.getMonth(); dd = date_obj.getDate(); hour = date_obj.getHours(); min = date_obj.getMinutes(); sec = date_obj.getSeconds(); //1970年1月1日からイベントまでの時間をミリ秒で取得 eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 ); //1970年1月1日から今日までの時間をミリ秒で取得 todayUTC = Date.UTC( yy , mm , dd , hour , min , sec ); //画像で数字を表示できるようにする with( _root.display_clip ) { /*日数を2桁で表示*/ //100の位の算出と表示 temp = Math.floor( _root.display_clip.event_date / 100 ); ddd.gotoAndStop( temp + 1 ); //10の位の算出と表示 temp = Math.floor( _root.display_clip.event_date / 10 ); dd.gotoAndStop( temp + 1 ); //1の位の算出と表示 d.gotoAndStop( ( _root.display_clip.event_date % 10 ) + 1 ); 必要部分かと思う箇所だけ掲載しました。自分で修正した部分は、イベント日や日数を3桁表示にするという部分などです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

絶対時刻(ミリ秒)の取得方法が少々回りくどいですが, それはそれとして良しとするなら間違いはないと思います。 問題なく取得できると思います。 > 2009年4月30日までは、正確に表示されるのですが、 > 5月1日以降になると残日数がいきなり増えてしまいます。 それは約 100 日を超えるからでしょう。 3桁表示に突入するということです。 つまり時刻取得部分ではなく, ムービークリップのすすめ方に問題があるのでしょう。 _root.display_clip.event_date には残り日数のみがちゃんと取得できているものとして, そこにたまたま入った値が仮に 245 (整数)であったとします。 ---------------------------------------------- //100の位の算出と表示 temp = Math.floor( 245 / 100 ); //→temp = 2 ddd.gotoAndStop( temp + 1 ); //→ddd.gotoAndStop(3) //10の位の算出と表示 temp = Math.floor( 245 / 10 ); //→temp = 24 dd.gotoAndStop( temp + 1 ); //→ddd.gotoAndStop(25) //1の位の算出と表示 d.gotoAndStop( ( 245 % 10 ) + 1 ); //→ddd.gotoAndStop(6) ---------------------------------------------- 「10の位の算出と表示」がおかしいですね。 仮に残り日数が 245 (整数)であったとして, この 245 から, 2 だけ 4 だけ 5 だけを取りだすのに数学(というかややこしい算数)を使う方法もありまが, ここは,数 ではなく 文字列 として取りだすと簡単になると思います。 "245" を文字列だと思って, 一番右の文字を取りだして,2番目の文字を取りだして,3番目の文字を取りだす。 ということです。 具体的に書くと, ムービークリップのフレームを進める部分のスクリプトは次のようにすると良いと思います。 (ただし _root.display_clip.event_date には整数が入っていること。) ----------------------------------------------- //100の位の算出と表示 temp = ("00"+_root.display_clip.event_date).substr(-3, 1); ddd.gotoAndStop(Number(temp)+1); //10の位の算出と表示 temp = ("00"+_root.display_clip.event_date).substr(-2, 1); dd.gotoAndStop(Number(temp)+1); //1の位の算出と表示 temp = ("00"+_root.display_clip.event_date).substr(-1, 1); d.gotoAndStop(Number(temp)+1); ----------------------------------------------- "00" を付けているのは,たとえば _root.display_clip.event_dateが 5 であった場合()内を "005", _root.display_clip.event_dateが 69 であった場合()内を "0069" などにするためです。 こうしておいて, .substr(-3, 1); では その文字列の右から3文字目から1文字を取得します。 .substr(-2, 1); では その文字列の右から2文字目から1文字を取得します。 .substr(-1, 1); では その文字列の右から1文字目から1文字を取得します。 _root.display_clip.event_dateが 5 であった場合は, ()内は "005" になるのですから, .substr(-3, 1); では "005" 右から3文字目から1文字→ "0" .substr(-2, 1); では "005" 右から2文字目から1文字→ "0" .substr(-1, 1); では "005" 右から1文字目から1文字→ "5" がそれぞれ取得できます。 _root.display_clip.event_dateが 69 であった場合は, ()内は "0069" になるのですから, .substr(-3, 1); では "0069" 右から3文字目から1文字→ "0" .substr(-2, 1); では "0069" 右から2文字目から1文字→ "6" .substr(-1, 1); では "0069" 右から1文字目から1文字→ "9" がそれぞれ取得できます。 _root.display_clip.event_dateが 245 であった場合は, ()内は "000245" になるのですから, .substr(-3, 1); では "000245" 右から3文字目から1文字→ "2" .substr(-2, 1); では "000245" 右から2文字目から1文字→ "4" .substr(-1, 1); では "000245" 右から1文字目から1文字→ "5" がそれぞれ取得できます。

_ribbon_
質問者

お礼

丁寧に詳しくご説明くださり有難うございました。 BlurFiltan様の書いてくださったスクリプトをコピペさせていただき、書き換えましたところ、正確に日数を表示させることができました。 まだFLASHをはじめたばかり。まして独学なので、詳しい方の真似からはじめ、少しずつ勉強させていただいている状態です。 詳しくご説明していただけたことに、大変感謝いたします。 このスクリプトを参考にさせていただいて、今後も勉強に励みたいと思います。 また質問をさせていただくと思いますが、その時はどうぞよろしくお願いいたします。

その他の回答 (3)

回答No.4

No1です。書いた答えは的外れでした。大変失礼を・・。 BlurFiltanさんが動作を修正して下さっていますので、置き換える部分だけ示しますね。 ---------------------(以下、ソースの置換部分)---------- //Date オブジェクトを生成 date_obj = new Date(); (中略) //1970年1月1日から今日までの時間をミリ秒で取得 todayUTC = Date.UTC( yy , mm , dd , hour , min , sec );

_ribbon_
質問者

お礼

私の説明不足で申し訳ありませんでした。 「Date.UTCは推奨されていません」と教えていただき、大変参考になりました。簡単なことかもしれませんが、このようなこともまだわからないので、とても勉強になりました。 有難うございました。 ソースの置換部分を修正しましたが、下記エラーがでてしまいました。 ---------------------------------------------------- **エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 9:演算子 '=' は、オペランドの前に来る必要があります。 String[] ids = TimeZone.getAvailableIDs(9 * 60 * 60 * 1000); **エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 15:シンタックスエラー SimpleTimeZone pdt = new SimpleTimeZone(9 * 60 * 60 * 1000, ids[0]); **エラー** シーン = シーン 1, レイヤー = レイヤー 1, フレーム = 1 :行 18:シンタックスエラー Calendar calendarE = new GregorianCalendar(pdt); ActionScript エラー数 :3 報告済みエラー :3 ---------------------------------------------------- エラーの意味もわかっていないので、置換前のままにしてありますが、まずは自分でがんばって調べてみようと思います。 自力ではカウントダウンの表示方法を直すことができず、こちらに投稿させていただきましたが、本当に助かりました。 「どうしてこんなエラーがでるの」と伺いたいのですが、そこまでお世話になれないと思うので、ここで質問を締め切らせていただきます。 また質問させていただくと思いますが、どうぞよろしくお願いいたします。

回答No.2

おもいきり蛇足ですが・・Date.UTCは推奨されていません、と怒られましたので、手直ししてみました。 // get the supported ids for GMT+09:00 (Japanese Standard Time) String[] ids = TimeZone.getAvailableIDs(9 * 60 * 60 * 1000); // if no ids were returned, something is wrong. get out. if (ids.length == 0){ System.exit(0); } // create a Pacific Standard Time time zone SimpleTimeZone pdt = new SimpleTimeZone(9 * 60 * 60 * 1000, ids[0]); // create a GregorianCalendar with the Pacific Daylight time zone // and the current date and time Calendar calendarE = new GregorianCalendar(pdt); todayUTC = calendarE.getTime().getTime(); calendarE.set( 2010 , 1 - 1 , 16 , 17 , 30 , 0 ); eventUTC = calendarE.getTime().getTime();

_ribbon_
質問者

お礼

手直しをしてくださり、お手間をかけて申し訳ありませんでした。 ありがとうございます。 このカウンターが初めてFLASHで作成したもので、他の方のご質問のご回答を参考にさせていただいていました。 せっかく手直しをしてくださったのに、どこにこのスクリプトを入れてよいのかわからなく、申し訳なく思っております。 以下、長くなってしまいますので、内容をわけさせていただきます。

_ribbon_
質問者

補足

先ほどの続きなのですが、自分が今回作成したカウンターで、使わせていただいたスクリプトを記します。 //ダミーのムービークリップを作る _root.createEmptyMovieClip( "date_cnt" , 0 ); //イベントまでの日数を秒単位で計算 date_cnt.onEnterFrame = function() { //Date オブジェクトを生成 date_obj = new Date(); //現在の日付および時刻を取得 yy = date_obj.getFullYear(); mm = date_obj.getMonth(); dd = date_obj.getDate(); hour = date_obj.getHours(); min = date_obj.getMinutes(); sec = date_obj.getSeconds(); //1970年1月1日からイベントまでの時間をミリ秒で取得 eventUTC = Date.UTC( 2009 , 5 - 1 , 2 , 9 , 30 , 0 ); //1970年1月1日から今日までの時間をミリ秒で取得 todayUTC = Date.UTC( yy , mm , dd , hour , min , sec ); //画像で数字を表示できるようにする with( _root.display_clip ) { /*日数を2桁で表示*/ //100の位の算出と表示 temp = Math.floor( _root.display_clip.event_date / 100 ); ddd.gotoAndStop( temp + 1 ); //10の位の算出と表示 temp = Math.floor( _root.display_clip.event_date / 10 ); dd.gotoAndStop( temp + 1 ); //1の位の算出と表示 d.gotoAndStop( ( _root.display_clip.event_date % 10 ) + 1 ); /*時間を2桁で表示*/ //10の位の算出と表示 temp = Math.floor( _root.display_clip.event_hour / 10 ); hh.gotoAndStop( temp + 1 ); //1の位の算出と表示 h.gotoAndStop( ( _root.display_clip.event_hour % 10 ) + 1 ); /*分を2桁で表示*/ //10の位の算出と表示 temp = Math.floor( _root.display_clip.event_min / 10 ); mm.gotoAndStop( temp + 1 ); //1の位の算出と表示 m.gotoAndStop( ( _root.display_clip.event_min % 10 ) + 1 ); /*秒を2桁で表示*/ //10の位の算出と表示 temp = Math.floor( _root.display_clip.event_sec / 10 ); ss.gotoAndStop( temp + 1 ); //1の位の算出と表示 s.gotoAndStop( ( _root.display_clip.event_sec % 10 ) + 1 ); } //イベント当日または終了のチェック if( ( eventUTC - todayUTC ) <= 0 ) { //「終了のお知らせ」を表示し、日数カウント用のムービークリップを削除する _root.display_clip.gotoAndStop( 2 ); removeMovieClip( _root.date_cnt ); } //イベントまでの時間を秒単位に直す remain = eventUTC - todayUTC; _root.display_clip.event_date = Math.floor( remain / 86400 / 1000 ); remain -= _root.display_clip.event_date * 86400 * 1000; _root.display_clip.event_hour = Math.floor( remain / 3600 / 1000 ); remain -= _root.display_clip.event_hour * 3600 * 1000; _root.display_clip.event_min = Math.floor( remain / 60 / 1000 ); _root.display_clip.event_sec = Math.floor(( remain - _root.display_clip.event_min * 60 * 1000 ) / 1000 ); };

回答No.1

>eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 ); イベント日は2010年では? eventUTC = Date.UTC( 2010 , 1 - 1 , 16 , 17 , 30 , 0 ); が正しくありませんか? 2010/1/16 17:30までだとこんな計算結果になるのですが。 2009/4/29 0:0:0 = 22699800000remain 262日17時間30分0秒 2009/4/30 0:0:0 = 22613400000remain 261日17時間30分0秒 2009/5/1 0:0:0 = 22527000000remain 260日17時間30分0秒 2009/5/2 0:0:0 = 22440600000remain 259日17時間30分0秒 2009/5/3 0:0:0 = 22354200000remain 258日17時間30分0秒 2009/5/4 0:0:0 = 22267800000remain 257日17時間30分0秒

_ribbon_
質問者

お礼

ご指摘ありがとうございました。 自分でいろいろかまっている内に、 >eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 ); この部分を直すことを忘れてしまっていました。 ご回答くださった内容を参考にし、もう一度試してみます。

_ribbon_
質問者

補足

大変申し訳ありません。 ご回答くださいました「回答番号:No.2」のお礼の続きになります。 今回自分が使用させていただきました、スクリプトの参考ページには、日数の表示が2桁になっており、3桁表示をさせようと自分でかまってしまいました。 これが間違っていたようで、 eventUTC = Date.UTC( 2009 , 5 - 1 , 1 , 17 , 30 , 0 ); イベント日を2009年5月1日にすると、残99日になるのですが、 5月2日にすると、残190日になってしまい、2桁目の0が表示されていないようです。 そのために、正確な残日数が表示できていないのかと思ったのですが、上記のスクリプト内で、どこを修正してよいのかわかっていません。 勉強不足を十分感じております。 お手間をおかけしますが、再度ご教示いただけますようお願いいたします。

関連するQ&A