localtime()での時間差の計算方法

このQ&Aのポイント
  • $ENV{'TZ'} = "JST-9";としてlocaltime()で現在の日時を取得し、指定の形式に整形することができます。
  • 登録日と現在の日数の差を計算するためには、登録日も同じ形式に整形する必要があります。
  • 登録日と現在の日数の差を計算する方法は、時間差を秒単位で取得し、7日を表す秒数で比較することです。
回答を見る
  • ベストアンサー

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
  • 回答数1
  • ありがとう数1

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

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

CGIのところじゃなくてPerlのとことで訊いたほうがよいと思いますが、 お使いのサーバでモジュールを使ってよいのなら、 Date::Simple あたりを使ってみるとか use Date::Simple; my $today = Date::Simple->new; my $registerd_date = Date::Simple->new($year, $mon, $day); if (registerd_date) { my $distance = $today - registerd_date; print "登録された日から $distance 日ですね\n"; } else { print "登録日付がおかしくねっすか?\n" } んな感じで。 インストールなどの手順は参考URLで。

参考URL:
http://allabout.co.jp/internet/cgiperl/closeup/CU20040805A/index4.htm
leap_day
質問者

お礼

回答ありがとうございます 勉強不足でまだまだ知らない手法が色々あるのですね 質問投稿した後、どうにか計算できないか色々やってみたところ・・・ $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); で得られる$now="50,33,15,1,0,107,0,27,0 485,197,854,";をそのまま登録日のデータとして残して $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $date="50,33,15,26,4,107,0,27,0 485,197,854,"; foreach($date){ ($sc,$mi,$ho,$md,$mo,$ye,$wday0,$yday0,$isdst0)=split(/,/); } if($year eq $ye and $mon eq $mo) { $time=$mday-$md; }elsif($year eq $ye and $mon-$mo eq 1){ $time=$mday-$md; if($mo eq 1){ if($year%4 eq 0){$time=$time+29; } else{$time=$time+28;} }elsif($mo eq 3 or $mo eq 5 or $mo eq 8 or $mo eq 10){$time=$time+30; }else{$time=$time+31; } }elsif($year-$ye eq 1 and $mon eq 0 and $mo eq 11) { $time=$mday-$md+31; }else{$time_hit=1; } if($time >= 7) {$time_hit=1; } if($time_hit eq 1) {print"7日以上です\n"; } else{ print"7日以下です\n"; } としたらちょっと面倒ですが何とかできました!! ありがとうございましたm(--)m

関連するQ&A

  • 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
  • 掲示板への書き込み時間

    掲示板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について

    まだCGIを勉強はじめのなのですが、localtimeについて質問させてください。 書籍で時間取得には ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); とし、time関数で得たものをlocaltime関数で整形 といった事が書かれています。 まずわからないのが最初の ($sec,$min,$hour,$mday,$mon,$year,$wno) = の部分なのですが、カッコ内に変数を並べるというのはどういった命令なのでしょうか?書籍ではここまででこのような使い方や記述は出てきていないので、それ自体がよく理解できずにいます。それとも($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time);をおきまりパターンとしてワンセットで覚えるべき事なのでしょうか。 続いてlocaltime(time)ですが、これは()内のtime関数によって取得された1970年基準からの秒数を、localtimeによって英語圏での標準的な日付時間表記に直して表示するという事で良いのですよね? これが、なぜ ($sec,$min,$hour,$mday,$mon,$year,$wno) とすることで各変数に割り振ることができるのかがよく分かりません。 これらはおきまりパターンとして覚えるべき事なのでしょうか?それとも配列のようにあるパターンに乗っ取って書かれ得いる事で他に応用がきくような意味合いのものなのでしょうか? ご教授いただきたく思います。 よろしくお願いします。

    • 締切済み
    • CGI
  • 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で以下のように 現在時刻を求め表示するロジックがあります。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year=$year + 1900; $mon =$mon + 1; $date81 = "$year年$mon月$mday日($days[$wday])"; $date82 = "$hour時$min分$sec秒"; この時、 例えば今年末であれば、 2009年1月1日0時と表示されると思います。 これを2008年12月31日24時と表示したいのですが、 何か妙案はあるでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 1桁の日付に0を付ける

    日時を取得して、表示する際に「2010/3/16」を、→「2010/03/16」 のように数字が1桁の時だけ「0」を足して表示させたいのですが どのようにすれば良いでしょうか。 ------------------------------------- ($sec,$min,$hour,$day,$mon,$yea,$wdy,$yday,$isdst) = localtime(time); $year = $yea + 1900; $mon++; $nitiji= join("","$year/$mon/$day"," ","$hour",":","$min"); ------------------------------------- 上記の方法で、perlで書き出したhtmlに「$nitiji」を埋め込んで表示させているのですが 「0」をつけることができず困っております。 (システム上、そのようにしたいので) できれば「print(・・・」「「printf(・・・」」などの形式ではなく 「$nitiji」に直接その数値を入れられると良いのですが。 良い方法がありましたら宜しくお願いします。

    • ベストアンサー
    • Perl
  • 先月(YYYYMM)の生成方法

    言語は問いません。 先月をYYYYMM形式の文字列で得るクールな方法ってありますか? Perlで以下のように書けば正しく動きますが、なんかダサイ気がします。 my ($sec, $min, $hour, $mday, $mon, $year) = localtime ; $year -= 1 if $mon == 0; $mon = '12' if $mon == 0; $yearmonth = sprintf("%4d%02d", $year+1900, $mon); よろしくお願いします。

  • perl print文で日本語表示するには

    perlのプログラムで use utf8が宣言されていない時(test1.pl)は、 print文で日本語が正しく表示されるのですが、 use utf8が宣言されている時(test2.pl)は、 print文で日本語が正しく表示されないかエラーになります。 encode('utf-8', $string)やencode('cp932', $string) も試してみましたがうまくいきませんでした。 どのようにすればよいでしょうか。 ---test1.pl------------------------------------------------ #!C:/perl/bin/perl use strict; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; ----------------------------------------------------------- 実行結果 OK 2018年12月26日 9時36分6秒 ----------------------------------------------------------- ---test2.pl------------------------------------------------ #!C:/perl/bin/perl use strict; use utf8; use Encode; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; #print encode('utf-8', $string); #print encode('cp932', $string); --------------------------------------------------- 実行結果 NG (PC1 Windows7 ActivePerl) Wide character in print at D:\test\test2.pl line 11. Global symbol "$year年" requires explicit package name (did you forget to declare "my $year年"?) at D:\test\test2.pl line 8. Global symbol "$mon月" requires explicit package name (did you forget to declare "my $mon月"?) at D:\test\test2.pl line 8. Global symbol "$mday日" requires explicit package name (did you forget to declare "my $mday日"?) at D:\test\test2.pl line 8. Global symbol "$hour時" requires explicit package name (did you forget to declare "my $hour時"?) at D:\test\test2.pl line 8. Global symbol "$min分" requires explicit package name (did you forget to declare "my $min分"?) at D:\test\test2.pl line 8. Global symbol "$sec秒" requires explicit package name (did you forget to declare "my $sec秒"?) at D:\test\test2.pl line 8. Execution of D:\test\test2.pl aborted due to compilation errors. ----------------------------------------------------- 実行結果 NG (PC2 Windows7 ActivePerl) Malformed UTF-8 character (unexpected continuation byte 0x94, with no precedingstart byte) at C:\test\test2.pl line 8. (略) Malformed UTF-8 character (unexpected continuation byte 0x95, with no precedingstart byte) at C:\test\test2.pl line 8. 2018 N12 26 9 5 4 b ----------------------------------------------------- 期待している実行結果 2018年12月26日 9時36分6秒 ----------------------------------------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • 現在時刻をyyyymmddhhmmss形式で変数に格納する

    いつもお世話になっております。 現在時刻を取得し、yyyymmddhhmmss形式で ひとつの変数に持たせたいとおもっているのですが 可能でしょうか? ---------- 1 #include <stdio.h> 2 #include <time.h> 3 4 int main(void) 5 { 6 struct tm *date; 7 time_t now; 8 int year; 9 int month; 10 int day; 11 int hour, minute, second; 12 13 /* 現在の日時を取得 */ 14 time(&now); 15 date = localtime(&now); 16 17 year = date->tm_year + 1900; 18 month = date->tm_mon + 1; 19 day = date->tm_mday; 20 hour = date->tm_hour; 21 minute = date->tm_min; 22 second = date->tm_sec; 23 24 return 0; 25 26 } 27 --------------- yearからsecondを結合してひとつの変数に格納することは可能でしょうか??

  • 漢字交じり文字列からのlocaltimeの求め方

    perlのCIGを改造してエラーチェック機能をつけようとしています。 htmlのフォームから「2004年5月16日登録」とか「2005年12月22日削除」といった文字列が送られてくるのですが、ここから数字部分だけ抜き出してlocaltimeに直し、改造前からcgiに備わっている($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);で割り出した数値と比較して例えばif $hikaku>localtime...errorといった形でエラーを返すようにしようとしています。 ここで、フォームから送られたデータから「2004」を抽出するには @kirokunen = split(/年/,$hiduke); $nenn = $kirokunen[0]); 「5月」の5を抽出するには2004を抽出した残りを利用して @kirokugatu = split(/月/,$kirokunen[1]); $gatu = $kirokugatu[0]); 同様に @kirokuniti = split(/日/,$kirokugatu[1]); $gatu = $kirokuniti[0]); として $hikaku = timelocal($sec, $min, $hour, $niti, $gatu - 1, $nenn); としてtimeを求めようとしたのですが、年号だけは抽出できたのに、月や日は、表面上は「5」とか「16」と言った具合にちゃんと数字だけになっているのに、timelocalの式に代入するとinternal server errorになってしまいます。 これは何がいけないのでしょうか? 他の部分の改造は手に負えないので、フォームから送らせるデータの方は直さず、「2004年5月16日登録」の形からtimelocalを求めるにはどうしたらよいのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう