• ベストアンサー

エポック秒の基点について

基礎的な質問ですみません。 ------------------------------------------------- my $time1 = timelocal(0,0,9,1,1-1,1970-1900); my $time2 = timelocal(0,0,10,1,1-1,1970-1900); my @ltime = localtime(0); my $time3 = sprintf("%d年%d月%d日%02d時%02d分%02d秒", $ltime[5]+1900,$ltime[4]+1,$ltime[3],$ltime[2],$ltime[1],$ltime[0]); print<<"EOM"; 1970年1月1日9時00分00秒のエポック秒は $time1 です。 1970年1月1日10時00分00秒のエポック秒は $time2 です。 エポック秒 0 は $time3 です。 EOM ------------------------------------------------ と書きます。結果は、 ------------------------------------------------ 1970年1月1日9時00分00秒のエポック秒は -3600 です。 1970年1月1日10時00分00秒のエポック秒は 3600 です。 エポック秒 0 は 1970年1月1日09時00分00秒 です。 ------------------------------------------------ となります。なぜこのように矛盾するのでしょうか。 私が正しく理解できていないだけでしょうか。 教えてください。お願いします。

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

  • ベストアンサー
  • hikomin
  • ベストアンサー率63% (40/63)
回答No.1

不思議ですね。ウチの環境では、 use Time::Local; print timelocal( 0, 0, 8, 1, 0, 70); # => -3600 print timelocal( 0, 0, 9, 1, 0, 70); # => 0 print timelocal( 0, 0, 10, 1, 0, 70); # => 3600 となりましたけれど。 もうちょっと調べてみますが…。

vvat2
質問者

補足

あらら? ご回答ありがとうございます。 不思議?今PCでやっていますので、サーバーにおいてテストしてみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • t140
  • ベストアンサー率39% (59/150)
回答No.3

サーバのタイムゾーン設定でlocaltimeは違うと思います。 gmtimeは世界共通のグリニッジ世界標準時GMTです。 サーバの設定でGMTやJSTなどさまざまでしょう。

vvat2
質問者

補足

お答えいただいてありがとうございます。しかし、私の質問の意図とは違う答えのようです。 サーバーとPCの間で時間が食い違ってるという意味ではなく、私のPCで実行したときの結果がおかしいのです。 私のPCで my $time = timelocal(0,0,9,1,1-1,1970-1900); と書けば、$time に -3600 が返されます。 my $time = timelocal(59,59,9,1,1-1,1970-1900); と書けば、$time に -1 が返されます。 my $time = timelocal(0,0,10,1,1-1,1970-1900); と書けば、$time に 3600 が返されます。 最初は私の理解不足かと思ったのですが、そうではないようなので、ApachかPerlがおかしくなっているのか、それともわたしのPCの環境ににPerlと相性が合わない何かがあるのかだと思っています。 なので、PCにApacheとPerlを再インストールしてみようと思っています。 せっかくお答えいただいたのにすみません。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

1970年1月1日9時00分00秒のエポック秒は 0 です。 1970年1月1日10時00分00秒のエポック秒は 3600 です。 エポック秒 0 は 1970年1月1日09時00分00秒 です。 ウチもuse Time::Local; で上記のような結果になりました。

vvat2
質問者

補足

テストしていただいてありがとうございます。 iswebのレンタルサーバに置いて実行したら、ちゃんと 1970年1月1日9時00分00秒のエポック秒は 0 です。 1970年1月1日10時00分00秒のエポック秒は 3600 です。 エポック秒 0 は 1970年1月1日09時00分00秒 です。 となりました。 PCにインストールしたperlがおかしくなってるのか? あしたperl再インストールしてみましょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 一日(0時0分0秒)おきに表示される文字列を変える

    一日(0時0分0秒)おきに表示される文字列を変えたいのですが、time関数を使って一日(0時0分0秒)の判定がうまくいきません ---以下ソース--- #include <stdio.h> #include <time.h> void *main(void){ time_t timer; struct tm *t_st; int i; char *set[20] ={"お帰り", "帰ってきたな", "どこ行ってたの?プンプン", //---残りは省略します--- }; time(&timer); i=((timer-54000)/86400)%20; //-54000は誤差修正のつもり printf("%s", set[i]); } ---ソースここまで--- 一日(0時0分0秒)の判定がちゃんとされるにはどうしたらいいのでしょうか? localtime関数を使って何日や1月1日から何日経過したかを調べて判定を変えるというのは無しです。 その場合は一ヶ月や一年ごとに初期値に戻されるので。

  • 現在時刻をミリ秒まで取得

    お疲れ様です 現在時刻をミリ秒まで取得がしたいです。 今はtime_tを使って秒までは取得したのですがミリ秒は構造体にないらしく同じようにとってはこれないのでしょうか? また別のやり方だとどんなのがあるか教えてください。 現在は下記のように取得してyyyymmddhhmmssの形を作ってます。 これをyyyymmddhhmmsssssのようにミリ秒を増やしたたいのです。 長くなってしまいましたがよろしくお願いします time_t timer; time(&timer);/* 現在の時刻を取得 */ struct tm *local; local =localtime(&timer);/* 地方時の構造体に変換 */ CString time; //CString用の時間 time.Format("%4d%02d%02d%02d%02d%02d" ,local->tm_year + 1900,/* 年 */ local->tm_mon+1,/*月は0から始まるので1を+*/ local->tm_mday,/* 日 */ local->tm_hour,/* 時 */ local->tm_min,/* 分 */ local->tm_sec);/* 秒 */

  • カウントダウン タグだけが表示されません。

    レンタルサーバーは使えるねっと http://www.tsukaeru.net/ を使ってるのですが カウントダウンタグ(SSI)が表示されません。 カウントダウンタグは↓の通りです。 ---------------------------- /usr/bin/perl ues strict; use Time::Local; #2006/1/1 00:00:00を目的日時とする場合 my $end_time = timelocal(0,0,0,1,0-1,2006-1900); my $countdown = $end_time - time; my $days = int($countdown / (60*60*24)); my $hour = int($countdown % (60*6024))/(60*60)); my $tmp_min=int(($countdown % (60*60*24))%(60*60)); my $min = int($tmp_min / 60); my $sec = $tmp_min % 60; print<<"EOM"; $days日と$hour時間$min分$sec秒 EOM exit; 1; -------------------------------- ↓のように書いて別のページにカウントダウンを表示させようとしてます。 <!--#exec cmd="./countdown.shtml" --> ご指南のほどよろしくお願いします。

    • ベストアンサー
    • CGI
  • うるう秒について

    来年の平成18年(2006年)1月1日(日) 午前8時59分59秒と午前9時00分00秒の間に「8時59分60秒」 をするみたいですよね もし「うるう秒」を実地しなければ、不具合が発生するのでしょうか? 詳しい方は、是非!!簡単に教えて下さい

  • PerlからPHPへ移行 Part2

    以下、Perlのソースですが、これをコメントどおりに PHPに直すとどうなりますか? Time::Localは ppm install Time-Localでインストールできます。 use strict; BEGIN{ # BEGINはPHPで $|=1; # バッファリングしない } use Time::Local; #PHPでUseは? sub test_date_time{ my ($year, $mon, $mday, $hours, $min, $sec) = @_; # 可変引数な方法 my $serial = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); my $moji = sprintf("$year年$mon月$mday日 $hours時$min分$sec秒"); return ($serial, $moji); # 複数の戻り値で様々な型で返す方法 } my ($serial, $moji) = test_date_time(2006, 10, 2, 10, 25, 30); # 一度に受け取る方法 print q{シリアルは} . $serial . "\n"; #q print qq{文字列は$moji\n}; my $ptn = qr{^(.+?)年(.+?)月(.+?)日\s(.+?)時(.+?)分(.+?)秒$}; if($moji =~ /$ptn/i){ print "$1/$2/$3 $4:$5:$6\n"; } exit(0); # 結果 #シリアルは1159752330 #文字列は2006年10月2日 10時25分30秒 #2006/10/2 10:25:30

    • ベストアンサー
    • PHP
  • ユニックス時間(秒)を普通の日付時間(時:分:秒)に直すにはどうすればいいでしょうか。

    こんにちわ。質問させて頂きます。 C言語で、pcap.hによってキャプチャされたパケットのタイムスタンプ(秒)を、標準時間と申しますか、時:分:秒に直したいと考えています。 時間変換の関数で、ctime,asctime,localtime等があるのは分かっているので、localtime関数を使おうと思っているのですが、使ってみたところポインタのタイプが違うのでエラーが出てしまいます。 具体的には、 方法(1):time_t変数に代入してやってみる struct tm *t_st; time_t timer; timer = header->ts; t_st = localtime (&timer); 方法(2):localtime関数に直接放り込む t_st = localtime (&header->ts); 等を試してみたのですが当然アウトでした。 パケットヘッダの中の時間を表すheader->tsをどうにかlocaltime関数で使いたいと考えています。 これを解決する良い方法はあるでしょうか。 ご存知であればご教授いただけないでしょうか。どうぞよろしくお願いします。

  • 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
  • perl 曜日を入れる

    perl初心者です。試行錯誤の連続です・・・ このように ↓ ( )と曜日を追加するにはどうしたら良いでしょう?。 2008/07/05(土) また、変なところもありましたら指摘してください <(_ _)> #-------------------------------------- # 時間 $time = time(); # 範囲日 $day1 = day0($time + (86400 * 2)); $day2 = day0($time + (86400 * 3)); $day3 = day0($time + (86400 * 4)); ### @weeeeek = ('$day1','$day2','$day3','$day4','$day5','$day6'); # 日計算 sub day0{ my $time = shift || time(); my $day0 = $time + (24 * 60 * 60); my ($yyyy, $mm, $dd) = (localtime($day0))[5,4,3]; $yyyy += 1900; $mm += 1; return( sprintf('%4d/%2d/%2d', $yyyy, $mm, $dd) ); } #-------------------------------------- ### @list = ('(日)','(月)','火','水','木','金','土'); ### ( "$mm/$dd + "(" + list + ")" );

    • ベストアンサー
    • Perl
  • 漢字交じり文字列からの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
  • 時差が違う“うるう秒”

    イギリス・グリニッジ時刻7月1日午前0時に“うるう秒”が全世界同時に実施された。 ニュース番組を見ると、日本では “午前8時59分60秒” に1秒加算された。 しかし今はイギリスは夏時間(サマータイム)を採用しており、日本とイギリスの時差は8時間のはずだ。 (冬期間は通常の9時間時差) なぜうるう秒を “午前7時59分60秒” にしなかったのか?