重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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桁表示にするという部分などです。
よろしくお願いいたします。

A 回答 (4件)

絶対時刻(ミリ秒)の取得方法が少々回りくどいですが,


それはそれとして良しとするなら間違いはないと思います。
問題なく取得できると思います。


> 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"
がそれぞれ取得できます。
    • good
    • 0
この回答へのお礼

丁寧に詳しくご説明くださり有難うございました。
BlurFiltan様の書いてくださったスクリプトをコピペさせていただき、書き換えましたところ、正確に日数を表示させることができました。
まだFLASHをはじめたばかり。まして独学なので、詳しい方の真似からはじめ、少しずつ勉強させていただいている状態です。

詳しくご説明していただけたことに、大変感謝いたします。
このスクリプトを参考にさせていただいて、今後も勉強に励みたいと思います。
また質問をさせていただくと思いますが、その時はどうぞよろしくお願いいたします。

お礼日時:2009/01/22 05:38

No1です。

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

私の説明不足で申し訳ありませんでした。
「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
----------------------------------------------------

エラーの意味もわかっていないので、置換前のままにしてありますが、まずは自分でがんばって調べてみようと思います。

自力ではカウントダウンの表示方法を直すことができず、こちらに投稿させていただきましたが、本当に助かりました。
「どうしてこんなエラーがでるの」と伺いたいのですが、そこまでお世話になれないと思うので、ここで質問を締め切らせていただきます。
また質問させていただくと思いますが、どうぞよろしくお願いいたします。

お礼日時:2009/01/22 06:02

おもいきり蛇足ですが・・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();

この回答への補足

先ほどの続きなのですが、自分が今回作成したカウンターで、使わせていただいたスクリプトを記します。

//ダミーのムービークリップを作る
_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 );
};

補足日時:2009/01/21 17:36
    • good
    • 0
この回答へのお礼

手直しをしてくださり、お手間をかけて申し訳ありませんでした。
ありがとうございます。

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

以下、長くなってしまいますので、内容をわけさせていただきます。

お礼日時:2009/01/21 17:35

>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秒

この回答への補足

大変申し訳ありません。
ご回答くださいました「回答番号:No.2」のお礼の続きになります。

今回自分が使用させていただきました、スクリプトの参考ページには、日数の表示が2桁になっており、3桁表示をさせようと自分でかまってしまいました。
これが間違っていたようで、
eventUTC = Date.UTC( 2009 , 5 - 1 , 1 , 17 , 30 , 0 );
イベント日を2009年5月1日にすると、残99日になるのですが、
5月2日にすると、残190日になってしまい、2桁目の0が表示されていないようです。

そのために、正確な残日数が表示できていないのかと思ったのですが、上記のスクリプト内で、どこを修正してよいのかわかっていません。

勉強不足を十分感じております。
お手間をおかけしますが、再度ご教示いただけますようお願いいたします。

補足日時:2009/01/21 17:40
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございました。
自分でいろいろかまっている内に、
>eventUTC = Date.UTC( 2009 , 1 - 1 , 16 , 17 , 30 , 0 );
この部分を直すことを忘れてしまっていました。

ご回答くださった内容を参考にし、もう一度試してみます。

お礼日時:2009/01/21 17:03

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