1

私の友人と私は、IRCボットのかなり基本的な稼働時間スクリプトに取り組んでいます。

これが私たちのコードです:

function Uptime()
{
    global $uptimeStart;
    $currentTime = time();
    $uptime = $currentTime - $uptimeStart;
    $this->sendIRC("PRIVMSG {$this->ircChannel} :Uptime: ".date("z",$uptime)." Day(s) - ".date("H:i:s",$uptime));
}

$ uptimeStartは、スクリプトが実行されるとすぐにtime();として設定されます。

どういうわけか、この関数を実行すると、364日19時間で開始します。理由がわかりません。

4

4 に答える 4

4

あなた$uptimeはで使用されるべきタイムスタンプではなく、date()時間の違いです。タイムスタンプ(実際の日付に対応)ではなく、秒数があります。

このようなものを使って計算します(すばやく1つ、1日、2時間などのために余分な脳を入れます);)

 $minutes = $uptime / 60;
 $hours   = $minuts/60 ;
 $days    = $hours / 24

于 2011-01-23T15:06:28.413 に答える
2

5.3以降を使用している場合は、DateTimeクラスとDateIntervalクラスを使用してください。

$uptimeStart = new DateTime(); //at the beginning of your script

function Uptime() {
  global $uptimeStart;
  $end = new DateTime();

  $diff = $uptimeStart->diff($end);

  return $diff->format("%a days %H:%i:%s");
}
于 2011-01-23T15:09:31.083 に答える
1

その時差を呼んでも意味のあることは何も得られませんdate()。その時差を取り、年、月、日、時間で徐々に分割する必要があります。これらはすべて秒単位で測定されます。そうすれば、それらの用語の時差を知ることができます。

$daySeconds = 86400 ;
$monthSeconds = 86400 * 30 ;
$yearSeconds = 86400 * 365 ;

$years = $uptime / $yearSeconds ;
$yearsRemaining = $uptime % $yearSeconds ;

$months = $yearsRemaining / $monthSeconds ;
$monthsRemaining = $yearsRemaining % $monthSeconds ;

$days = $monthsRemaining / $daySeconds ;

..時間と分を取得するなど。

于 2011-01-23T15:09:20.037 に答える
0

2番目の引数が0に設定されたdate()関数は、実際には(zero-date +(your time zone))を返します。ここで、"zero-date"は"00:00:001970-01-01"です。タイムゾーンがUTC-5のように見えるので、(365日24時間)-(5時間)=(364日19時間)

また、date()関数は、2つの日付の違いを表示するための最良の方法ではありません。他の回答を参照してください-年間の差を計算するための良い方法がすでに投稿されています

于 2011-01-23T15:17:11.293 に答える