ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

超初心者向けCGI講座コミュのTime::Localを使わない場合は?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
みなさん、あけましておめでとうございます。

 正月休みは暇なので、カウントダウンお正月やクリスマス、誕生日、イベントなどの、「あと○×まで、??日と??分」などをwebに表示させるcgiを作りました。
 汎用性を持たせる為、あまりPerlバージョンに依存しないように作っていたのですが、Perl5の標準装備ということで、始めてモジュールを使いました。
 use Time::Local; にすると、すぐ表示されてモジュールって便利なんですねー。

 で、質問なのですが、このモジュールを使わなかった場合、先々の日付を現在のと比較する為には、どのように考えたら良いのでしょうか。
 「車輪は二度発明しない」は置いといてです。
 例えば、今年2006年9月1日までの秒数。
 1970年1月1日 00:00:00を起点として。

( (2006-1) - 1970 ) * 365日 * (60*60*24)
+ 閏年の数 * (60*60*24)
+ (9月 - 1) * (60*60*24)
+(1日 - 1) * (60*60*24)

30日や31日のある月日数計算は、ちょっと面倒で私には難しいです。
3月なら1月から何日分、9月なら何日分とあらかじめ計算してその数値を記述するのは、まだまだ修業が足りないですかねぇ。閏年は別計算。

と、ここまで考えたのですが。
本年も宜しくお願いいたします。

コメント(18)

↓目的の時間
mktime(時, 分, 秒, 日, 月, 年) - time()
でいかがでしょうか?
あ、すごい簡単!
で、済みません、$ がないので変数ではないと思うのですが、これ関数ですか?
リファレンスを見ても mktime がないのですが、古いのですかねぇ、平成12年になっています。
もう少し詳細を教えて頂けますか。
すみません。PHPを仕事で使っている関係で、PHPのコードを書いてしまいました。
perlでモジュールを利用しない場合、かなり難しいですね。

またいいアイディアが見つかりましたら書き込みさせていただきます。ご迷惑をおかけしました。
単純な方法かもしれませんが・・・

本日から未来の日付が何日後というデータを取得するには
while 文で 永久Loop するようにしておいて、Loop 中にて
今日の日付から1日ずつ加算して該当する日付が見つかったら
Loopを抜けるようにしておけば取得できると思います。

何日後の日付を取得したいという場合にはfor 文で Loop するように考えればいいのではないでしょうか。

この方法であれば閏年などを自分で考慮しなくても大丈夫だと思います。
あれからTime::Localを元にいい方法を考えていたのですが、
Time::Localが使えないのであれば、何らかの方法で先人の発明を使わせていただくのが一番よいのではないかと思い、
Time::Localをuseしないでもいい方法を考えてみました。

Local.pmさえ入手することができれば
require './Local.pm'; #ここではカレントディレクトリにあるものとする
print Time::Local::timelocal(0, 0, 0, 1, 1, 2006) - Time::Local::timelocal(0, 0, 0, 1, 1, 1970);

で使うことができます。
どうでもいいつっこみですが。

ちなみにmktimeの引数は時, 分, 秒, 日, 月, 年ではなく
時, 分, 秒, 月, 日, 年です。
Dilemmaさん>
ご指摘いただきましてありがとうございました。
Time::Localを使わない場合はTime::Localと同じ動きをする関数を自前で用意するしかないんじゃないですかね。

例外さえ抑えておけば問題なく作れるんじゃないかな?と思います。
もちろん閏年の計算は入ってきちゃいますが。
86401秒っていうのもあるらしいですしね 笑

#今年から、毎日0時0分0秒のEPOCHの下1桁は1になるんですかね。
変な感じ。


難しいのはカレンダーの祝日ですよねー。
調べて無いのですが、プログラムで作れるもんなのでしょうか。
今度仕様を調べてみなくちゃ。
ズレ発言ですが
perlでもuse POSIXすればmktimeは存在するっちゃします。

モジュールを使わない事によるメリットをほとんど感じないので、とりあえずコメントはここまで^-^;
 当然のごとく、大それた車輪を二度発明しようとは思っておらず、また作ったとしても楕円形の車輪になるのが関の山だと思います。車輪自体がないかもしれません。
 Time::Locaを使う使わないではなく、そんな未来の日時を知るにはどういう記述の仕方があるのかなと思ったところからです。
 Perl4の時はモジュールは使えなかったと思います。locl.plとかがあったのですかねぇ・・あった、みたい。でもyahooが止まっていて見られない。後で調べてみます。

 アラジンさんのは目から鱗です。
 未来を計算するのではなくて、現在から行くのですね。敬服〜。
 時間のある正月休み、いろいろやってみますね。
 アドバイスありがとうございました。
> 8 みずのさんへ
カレンダーの祝日について
国会などで、いつの間にか変わってたということが
ありますが、とりあえず、それはその都度変更ですね。

固定的な休日と可変的な休日とありますが
可変的な休日は
ハッピーマンデー法と振り替え休日、
あと春分の日とか秋分の日
これくらいでしょうか?

春分の日と秋分の日についても計算で決まるはずなので、
その計算式をもとにすればいいでしょう。

自分の場合は
春分の日と秋分の日は10年先まで配列に持っておいて
対応しています。10年経過したら削除せずに新たに配列の
後ろに追加するでしょうね。

同じシステムで10年何事も無く運用するというのは、
なかなか無いので、これでもいいかと思ってます。

> 10 ボッキ〜中島さんへ
参考になったのであればいいのですが。。。
頑張ってみてください。

モジュールが入っていないレンタルサーバーは
今でもあるので、お客様の要望に応えるため、
自作のモジュールを多少、困難であっても作ることが
要求されます。
自分では傑作、人から見れば駄作のものも結構、作って
いることになったりしますが。
アラジンさん、こんにちは。
 内容もそうですが、発想が大いに参考になりました。あとで実際に作ってみますね。
 プライべートなものなので、あと532日、みたいなのはなく、せいぜい100日以内です。100回ループは時間がかかるのでしょうかねぇ・・て、それも確認する楽しみがあります。
 #12のコメント、実際の現場で携わっているような臨場感を読んでいて感じ、勉強になりました。私の場合、聞きかじりに注意ですがね。
12:あんじーさん

> モジュールが入っていないレンタルサーバーは
今でもあるので

そのための5の方法です。
> 14 KIDD さんへ
どうも。アラジンです。
私が「自作のモジュール」と書いた分は「自作の関数」と
いう意味合いでした。
混同されてしまった方がいらっしゃったら申し訳ないです。
すみません。

うちのクライアント様の中には、外部からTELNETやSSHでのアクセスが許可されていないサーバを利用されている場合もあり、なるべく既存環境でということからコメントしておりました。
(予算が確保できるクライアント様だと助かるのですが。)


ちなみにLocal.pm を入手してませんので分からないのですが
下記サイトに記載されているようにpackage Time::Local;
という感じで使用していなければ 5の方法でOKでしょうね。

http://www.devdaily.com/scw/perl/perl-5.8.5/lib/Time/Local.pm.shtml
15:アラジンさん
「下記サイトに記載されているようにpackage Time::Local;
という感じで使用していなければ」 5の方法でOK

使用していなければ、がどこにかかるのかちょっとわからんかったですが、

結局は@INCに含まれるパスに、フォルダ構成をモジュールのpackage文にしたがって配置すればよいと思います。

ちょっとこの件についてエントリしてみた。
http://d.hatena.ne.jp/kidd-number5/20060104/1136355097
16: KIDD さんへ

モジュールが使えないレンタルサーバでは、モジュールと
同程度の関数を用意しなくてはいけないと書いたつもりは
無かったのですが。。。
実際、使えますしね。

読み返すと、表現も言葉も足りなかったりでおかしいな。
誤解を与えていた方には、申し訳ないです。
すみません。

個人的には
実現できれば、本人にとって楽と思える方法を使えば
いいと思いますよ。


言いたかったのは
先々の日付と現在の日付を比較する方法として
4に記載した方法はどうでしょうということ。

あとは
お客様の要望に応えるため、 様々なものをオリジナルで
作っていますが・・・自分では傑作、人から見れば駄作の
ものも結構、作って いることになったりします。

こんなとこなんですけどねぇ。。。
17:アラジンさん

なんといいますか別に口論とかそういうつもりもないし「いけない」とか極端な言い方もできれば避けたい感じなので(どこかにそういう決まりがあれば「いけない」って断固として言いますがw)何か表現上不適切な点がありましたらすみません。

#っていうか、それ以前に僕一回投稿で名前間違えています。素ですみません。

>個人的には
>実現できれば、本人にとって楽と思える方法を使えば
>いいと思いますよ。

まぁそれもそうなんですが、実は自作すると、不要な関数の部分を読み込まなくて済むので、もしかしたら実行速度がちょっと変わるかもしれません(試してもいないのに言うやつ)
このへん検証している人っているのかな。

たとえばこのコミュでも以前話題になっていたCGI.pmとcgi-lib.plの読み込みとかの違いなんですが、どうして速度が変わるのかなぁと興味があったりします。

まぁ速度の違いが(そんなところで)出るようなものはなんせ書いたことがない程度のレベルのものですから、もし知っていたら教えてください、と常々思ってます。

4に記載された方法については見たときにloopかぁ・・・と思ってしまい検証とかしていないので、Benchmarkとって見たいですね

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

超初心者向けCGI講座 更新情報

超初心者向けCGI講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング