WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:X年X月X日X時X分X秒X曜日のデータを秒数に変換する、(Perlで)

0:[投稿] chirumiru [MAIL] [URL] [2004/01/22 13:59 ][環境:IE6、Win98 UNIX]

こんにちわ、
chirumiruです。

自作BBSの上記のデータ変換をしたいのですが、
フィルタにくぐらせると、
実際より大きな数値が返されるようです。

自分なりに検討したのですが、
つきとめられずみなさんのお力添えを願いでることになりました。

いかが変換ルーチンです、
どの計算が間違っている(不要)なのでしょうか?

ご教示、よろしく願います。


sub to_sec_ {

@days=qw (31 28 31 30 31 30 31 31 30 31 30 31);


$_[0]=~s/(.+)年(.+)月(.+)日(.+)時(.+)分(.+)秒/$1\:$2\:$3\:$4\:$5\:$6/;
@time=split(/\:/, $_[0]);
$time[0]-=1970; $to_days1=$time[0]*365;
for ($i=0, $to_days2=0; $i<$time[1]; $i++) { $to_days2+=$days[$i]; }
$days=$to_days1+to_days2+$time[2];
$days+=&uruu_;
    
return($days*86400+$time[3]*3600+$time[4]*60+$time[5]);
}

sub uruu_ {
my (@uruu, $cnt)=(1970..2003);

foreach (@uruu) {
$cnt+=1 if ($_%4==0 && ($_%100!=0 || $_%400==0));
}

return($cnt);
}


1:[回答] 通りすがり [2004/01/22 15:16 ]

元ソースをいじる気無しw

------------------------------------------------------------
#!/usr/bin/perl

use strict;
use Time::Local;

my $date = '2004年1月22日16時15分14秒';
print to_sec_($date);

sub to_sec_ {
  my $date = shift;
  my @date = (split(/[^\d]+/, $date))[5,4,3,2,1,0];
     $date[4] -= 1;
  return timelocal(@date);
}
------------------------------------------------------------


2:[質問] chirumiru [MAIL] [URL] [2004/01/22 15:48 ]

こんにちわ、
通りすがりさん、(はじめまして)

ご教示ありがとう、
ございます。

なるほど、Perl5(?)を使ったり、その道の達人ともなると、これほど簡潔なソースですむんですね。

でもchirumiruはいま、らくだ本の『VOLUME1』の真ん中あたりをうろついてる状態で、モジュールを活用したプログラミングはもう少し先になりそうです。

だから、所々、?記号です。

元のソースを理解せず、
安易に通りすがりさんのソースに飛びつくのも、考えてしまいますので、もうしばらく、自前のソースの欠陥について検討します。

通りすがりさんにご提示いただいたソースは、そのときのためにコピぺしてファイルにおとしておきます。

もし、ご覧になられている方で、chirumiruのソースにつきあっていただけるかたがいましたら(もちろん、通りすがりさんにもつきあっていただいて、ソースをいただいたわけですが)、重ねてのご教示を願います。

ありがとうございました。


3:[回答] 通りすがり [2004/01/22 17:22 ]

>>2
感動した!
つーわけで、元ソースの変更

------------------------------------------------------------
> @days=qw (31 28 31 30 31 30 31 31 30 31 30 31);
@days=qw (0 31 28 31 30 31 30 31 31 30 31 30 31);
# 自身の月は $to_days2 に加えない。
# ( $time[2] と重複するので )
------------------------------------------------------------
ちなみにタイムゾーンの差異までは考慮してません。

ところで
> sub uruu_
年は必ず2000〜2003の範囲内って事で良いのでしょうか?
1999年とか2004年の場合に閏年のカウントがずれますけど。


4:[関連] chirumiru [MAIL] [URL] [2004/01/22 22:10 ]

こんばんわ、
通りすがりさん。

再度のご教示ありがとうございます。

通りすがりさんのご指摘、
配列の初期化ですが、そのとおりですね。
早速なおしました。

でも、
人に感動を与えるような大口をたたきながら、結果は芳しくありません、((T-T)、で報告が遅れました、申し訳ありません)

タイムゾーンのご指摘も検討してみます、(考えていると、わけがわからなくなってきて、結局わかったのは、通りすがりさんにご提示していただいた点だけです、(^-^;;;)

えっと、
フィルタの方ですが、
現在のログのデータをコンバートするためのものです、ですから、今年の閏年の日を迎えるまでに片づけば、2004年は検討しなくていいということです。

コンバートの理由は現行よりも秒数で保有する方が汎用性が高いと判断した結果です、(はじめのデータ設定は大切ですね)
現ログを放棄することも考えたんですが、将来プログラマを目指す端くれとして、それだと、資質が疑われますからね。

関係ないことを話してしまいました。

完了でおわりたいんですが、これからも情報待ちということで、関連にさせていただきたいと思います。

またのおりには、よろしく願いますね。

ご協力、ありがとうございました☆


5:[回答] 通りすがり [2004/01/23 11:29 ]

>>4
何がどう芳しくなかったのかがサッパリ分かりません。
32400秒多かったとかですか?


6:[回答] 通行人A [2004/01/23 12:08 ]

8行目:$days=$to_days1+to_days2+$time[2];

「$」が抜けている、なんて落ちでわ B-)


7:[回答] 通りすがり [2004/01/23 14:25 ]

>>6
ああ、そういえば僕も気づいたけど、検証の際に即効直したので忘れてました。
ごめん。


8:[関連] chirumiru [MAIL] [URL] [2004/01/23 16:01 ]

こんにちわ、
chirumiruです。

いま帰ってきました。

通りすがりさん、
ありがとうございます。

そうですね、
ご好意でおつきあいいただいてるのですから、
提示できる材料はすべてだすべきですね。

以後、
気をつけます。

通行人Aさん、
こんにちわ、(はじめまして&ありがとうございます)

思いっきりのミスです、はずかしい…。

これで、疑問解決か、
と浮き足だったのですが、ダメでした、(残念)

またのおりにはよろしく願います。

さてなにをしようかとしているかですが、
現在の形のログデータをtime関数で返される値にコンバートします。

それが正常終了すれば、BBS本体のスクリプトの日時データの保有をtime関数の返す値をなにも加工せず、記録するよう修正します。

そして、実行時に、localtime関数で整形・表示します。

いまわかったのは、
変換スクリプトをとおすと、118,800、大きい数値が算出されることです、(変換スクリプトをとおしたあとに表示される、X年〜から、実働版のログデータのX年〜を、秒数になおして算出した差)

以上です、

これで、to_sec_にバグあることがわかりました、
がんばってみます!!

P.S. 文をうまくまとめられないので長々となってしまいました。
すいません、m(_ _)m


9:[回答] 通りすがり [2004/01/23 17:00 ]

>>9
> 118,800、大きい数値
33時間のズレなので、JSTによる9時間+閏年1日分の増加かと。
JST は return 前に $time[3] -= 9; とかで良いでしょう。多分。
閏年はログの年数が2000年〜2003年までの間はずれないと思われそうなルーチンを使っているので、テストしたログの年が1996〜1999年になっていると思うのですが、いかがでしょう?
外してたらごめん。


10:[回答] chirumiru [MAIL] [URL] [2004/01/23 18:41 ]

こんばんわ、
通りすがりさん。

スクリプトをつくって、JSTというものを、
確認してみました。

$time=time;
$gm=gmtime($time);
$local=localtime($time);

print $gm."\n";
print $local;

この9時間の誤差ですが、
現在のログはすでに、localtime関数で9時間補正(適当なことばをつくってすいません)されていて、フィルタプログラムではそれを秒数になおして、それでテスト版のスクリプトでは、またそれを9時間補正しているから、生じるんですね?

見当違いならすいません。

あとは24です。
通りすがりさんのおかげで格段に意味を持った数値になりましたので、あとは自力でがんばってみます。

たぶん閏年かもしれません。

このたびはほんとうに助けていただきました、
あらためて礼を申し上げます。

またのおりにはよろしく願いますね☆(早く、解答陣に回れるよう、精進します)

P.S. “完了”にしないのは、結果報告をしたいからですが、まぎらわしければ、いってください。>ALL様。

でわ。


11:[回答] chirumiru [MAIL] [URL] [2004/01/23 19:55 ]

あっ、
秒を補正するって。

経過時間がちがうわけ、
ないですもんね。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World