- ベストアンサー
時間の加算・減算
以下の様にして現在の時間を取得できることがわかりました。 @d = localtime(); $d = sprintf("%02d/%02d/%02d %02d:%02d:%02d", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]); print "$d\n"; では、 30秒後 5時間後 1日後 10日後 を計算するにはどうすればよいのでしょうか。 また、これだと、”今から”になってしまうのですが、 たとえば 2006/10/10 10:10:10 から 30秒後 5時間後 1日後 10日後 という風に出力していくにはどうするのでしょうか。 今の時刻を表示する例はたくさんあったのですが、 加算に関してはあまりないようです・・・
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
以下のページを参考にしてください。 経過日数の計算 http://cocohome.hp.infoseek.co.jp/cocohome/l_nisukeisan.html
その他の回答 (2)
- luka3
- ベストアンサー率72% (453/623)
localtimeの反対ということで、timelocalという日付からtime値を求める関数(モジュール)があります。 使い方については割愛しますので検索してください。 もうひとつ、Zeller(ツェラー)の公式というのがありまして、曜日を求める公式があります。 この公式にうまく値をはめ込むとある時点からの経過日数をもとめることができます。 それを使ってtimelocalを自前で作ると下のようになります。 sub timelocal { my ($s, $m, $h, $dd, $mm, $yy) = @_; my $days = &pastdays($dd, $mm, $yy); $days -= &pastdays(1, 1, 1970); #1970/01/01を引く my $t = (($days*24 + $h)*60 + $m)*60 + $s; return $t; } sub pastdays {#西暦1年1月1日からの経過日数 my ($dd, $mm, $yy) = @_; if ($mm < 3) {$yy--; $mm += 12;} my $days = 365 * $yy + int($yy/4) - int($yy/100) + int($yy/400) + int(306*($mm + 1) / 10) + $dd - 428; return $days; } 5時間後なら timelocal(10,10,10,10,10,2006)+5*60*60 10日後なら timelocal(10,10,10,10,10,2006)+10*24*60*60 この値をlocaltimeすれば具体的な時間が出ると思います。 ただ、タイムゾーンを考慮してませんのでlocaltimeの前に日本語環境なら9時間分引くなど対応してください。
お礼
なかなか難しいですね。 御礼が遅くなり申し訳ありませんでした
- sakusaker7
- ベストアンサー率62% (800/1280)
自分で組むのは面倒なのでモジュールを使います。 use strict; use warnings; use Date::Calc qw(:all); =begin 2006/10/10 10:10:10 から 30秒後 5時間後 1日後 10日後 =cut my $basedate = [2006, 10, 10, 10, 10, 10]; my $base_year = 2006; my $base_month = 10; my $base_day = 10; my $base_hour = 10; my $base_min = 10; my $base_sec = 10; my @deltas = ( [0, 0, 0, 0, 0, 30, "30秒後"], [0, 0, 0, 5, 0, 0, "5時間後"], [0, 0, 1, 0, 0, 0, "1日後"], [0, 0, 10, 0, 0, 0, "10日後"], ); printf "%10s %4d/%02d/%02d %02d:%02d:%02d\n", "基準日", $base_year, $base_month, $base_day, $base_hour, $base_min, $base_sec; foreach my $delta_ref (@deltas) { my $year; my $month; my $day; my $hour; my $min; my $sec; my $msg = pop @{$delta_ref}; ($year,$month,$day, $hour,$min,$sec) = Add_Delta_YMDHMS($base_year, $base_month, $base_day, $base_hour, $base_min, $base_sec, @{$delta_ref}); printf "%10s %4d/%02d/%02d %02d:%02d:%02d\n", $msg, $year, $month, $day, $hour, $min, $sec; } 実行結果: 基準日 2006/10/10 10:10:10 30秒後 2006/10/10 10:10:40 5時間後 2006/10/10 15:10:10 1日後 2006/10/11 10:10:10 10日後 2006/10/20 10:10:10 残念ながら Date::Calcはコアモジュールでないので 別途インストールする手間はありますけど。
お礼
回答ありがとうございます。 Date::Calcが入っていなかったので、 ダウンロードしてみたのですが、まだほかにも足りないみたいで、 インストールできませんでした。 後でじっくりやってみたいと思います。
お礼
このページいいですね! やりたかったことが書いてあります!。 しかもわかりやすいです。 早速やってみます。 ありがとうございます!