• ベストアンサー

時間の加算・減算

以下の様にして現在の時間を取得できることがわかりました。 @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日後 という風に出力していくにはどうするのでしょうか。 今の時刻を表示する例はたくさんあったのですが、 加算に関してはあまりないようです・・・

  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

以下のページを参考にしてください。 経過日数の計算 http://cocohome.hp.infoseek.co.jp/cocohome/l_nisukeisan.html

azicyan
質問者

お礼

このページいいですね! やりたかったことが書いてあります!。 しかもわかりやすいです。 早速やってみます。 ありがとうございます!

その他の回答 (2)

  • luka3
  • ベストアンサー率74% (300/403)
回答No.3

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時間分引くなど対応してください。

azicyan
質問者

お礼

なかなか難しいですね。 御礼が遅くなり申し訳ありませんでした

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

自分で組むのは面倒なのでモジュールを使います。 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はコアモジュールでないので 別途インストールする手間はありますけど。

azicyan
質問者

お礼

回答ありがとうございます。 Date::Calcが入っていなかったので、 ダウンロードしてみたのですが、まだほかにも足りないみたいで、 インストールできませんでした。 後でじっくりやってみたいと思います。

関連するQ&A

  • 「分」単位で加算(減算)したい。

    「分」単位で加算(減算)したい。 y1=2010; //西暦 m1=7; //月 d1=6; //日 h1=10; //時 n1=30; //分 s1=0; //秒 のような特定の日時に対して、 例えば、「1000分加算(或いは減算)した『日時』」 という風に、「分」単位で加算・減算したいのですが、 やり方がわかりません。 基本的な操作かもしれませんが、どなたかご教授お願いします。 なお、日数での加算・減算は対処できております。 ↓====================================- var dt = new Date( y1, m1-1, d1); //元となる日付 var addSec = 86400000; var newDate = new Date(); newDate.setTime( dt.getTime()+addSec ); myYear = newDate.getYear(); myYear4 = (myYear < 2000) ? myYear+1900 : myYear; myMonth = newDate.getMonth()+1; myDate = newDate.getDate(); ↑====================================-

  • CGIについて(時間表示)

    CGI初心者ですが、掲示板を作成中です。投稿するたびにメッセージの投稿時間がすべて現在時刻に書き換わります。 メッセージ毎に時間表示させたいのですが、いかのプログラムのどこを変更すればよいのでしょうか?宜しくお願いいたします。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year +=1900; $month++; $year = sprintf("%04d", $year); $month = sprintf("%02d", $month); $mday = sprintf("%02d", $mday); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); $date = "$month/$mday $hour:$sec"; }

    • ベストアンサー
    • CGI
  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • エクセルで、時間を加算する計算式を教えてください。

    A行で9:50:19と入れた時間に、B行で45秒加算していきたいのですが、どのような計算式を入れればよいのでしょうか。教えてください。

  • PHPにおける時間計算、時間足し算に関して

    PHPを用いた時間の足し算方法についてお教えいただきたくお願いします。 12:30:00 (時間、時刻ではない)+ 12:30:00が25:00:00と表示されるようにしたい。 例えば、日ごとの勉強時間○○時間△△分□□秒を特定の日にち間での総勉強時間を算出しようとして、以下のようにコーディングしました。 なお、下記におけるleave,enterは開始時刻(HH:MM:SS)、終了時刻の文字列をstrtotime関数を用いて時刻変換したものを用いています。 24時間以内であれば、問題なく表示されるのですが、1日(24時間)以上の数値となると日にち分の時間(24、48時間等)が引かれた値が出力されます。dateの書式によるためと思われますが、36:50:30(現在の出力は12:50:30)と単純に足し算の結果を出力させるためにはどのようにコーディングすればよろしいでしょうか? よろしくお願いいたします。 $sum = 0; for($i=0; $i<$k; $i++){ $time_diff[$i] = $leave[$i] - $enter[$i]; $sum = $sum + $time_diff[$i]; } $sum = $sum + strtotime("0:0:0"); //localtimeを補正 $sum = date("H:i:s",$sum); print("累積時間:" .$sum. "<br>"); 場合にとっては総時間を秒で求める方法をご教示いただいても結構です(割り算で時間、分、秒として出すこともできますので)。

    • ベストアンサー
    • PHP
  • 時間の加算と初期値・加算値をクッキーに保存

    WEB上で日程表を作成したいのですが日付・時刻の加算とクッキーに保存する方法が分かりませんので教えて下さい ┌──┬────┐ │値1 │加算値1 │ ├──┼────┤ │値2 │加算値2 │ ├──┼────┤ │値3 │加算値3 │ ├──┼────┤ │値4 │加算値4 │ ├──┼────┤ │値5 │加算値5 │ └──┴────┘ 上記の様な表をテーブルで作成します 値1はinputタグで任意の日時を入力(「2003/9/5 16:00」等) 加算値1以降はinputタグで任意の時間を入力(2時間の場合「2」等) 値2以降は計算結果を表示する 値1に「2003/9/5 16:00」と入力 加算値1に「2」と入力 値2は値1+24時間+加算値1=「2003/9/5 18:00」と表示される 値3は値2+24時間+加算値2=「2003/9/6 18:00」と表示される(加算値2は未入力) 値4は値3+24時間+加算値3=「2003/9/7 19:00」と表示される(加算値3は「1」入力) 以下同様 値1・加算値1以降のinputタグに入力した値をクッキーに保存する 仕様としては以上です 宜しくお願い致します

  • phpプルダウンメニュー 日付チェック方法

    <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -0; $end = date('Y') +1; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> と記述して、日付選択のときに 本日より前の日を選んだら、エラー 本日より先の日を選んだら、OK 例→2009年01月01日は×  →2010年01月01日は○ というチェック方法をしたいのですが、どのように記述したらよろしいでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 掲示板への書き込み時間

    掲示板CGIについて質問です。 使おうとしているスクリプトはそのままアップロードすると書き込みした時間の表示が 「4/14 (Sun) 17:10」 のようになります。 これを 「2003 4/14 (日) 17:10:50」 のように年と秒まで加えたいのです。 それで後者のように表示される掲示板CGIを参考にしてみましたが、目立った違いはないように思え、どこをどう変更すれば年や秒まで表示されるようになるかわかりません。 思い当たる部分はこのあたりなのですが…。 ↓このように記述されています ************ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); $sec = sprintf("%02d",$sec); $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date_now = "$month/$mday ($youbi) $hour:$min"; ************ CGIに手を加えてレイアウトの変更くらいはいつもやっています。 もし書き換える方法がありましたら教えていただければと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • localtime()での時間差の計算の仕方

    $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $now =sprintf("%04d/%02d/%02d-%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min); とすると 2007/01/28-15:56 のようにデータとして取得できるのですが・・・ これと登録日($date=2006/12/31-12:25)との日数差の計算ができません $now-$date とすると年数のところしか計算できず1としか表示できません 登録7日後以降にイベントを発生させたいのですが計算ができないのでうまくいきません 両方time()でやれば$now-$date>604800 とすればなんとかできるのですが登録日は『2006/12/31-12:25』の形で使いたいのです 登録日と現在の日数の差の計算方法を教えてくださいm(--)m

    • ベストアンサー
    • CGI
  • php メールフォーム日付チェック方法

    現在メールフォームで生年月日を記述しており、生年月日の値を確認画面に渡し、確認画面にて日付チェックをして、日付が間違っていたらフォーム画面に戻るということをやりたいのですが、日付チェックの部分で困っています。 例→2月20日は○  →2月30日は× form.php <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> confirm.php //生年月日をチェック if (checkdate($month, $day, $year)) { $error[] = '生年月日が正しくありません。'; } という記述です。 この記述方法ですと、 2月20日は「生年月日が正しくありません。」とでてきますが、 2月31日を指定すると確認画面を通過できるという謎の状態になっています。 できれば閏年の計算もできる方法もお願いします。 どうかご教授お願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう