2012-01-27 15 views
1

これは日付間の+ 86400秒の標準ではありません。PHPの2つのUNIXタイムスタンプ間の実際の日数

$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$ daysInBetweenTimestamps =?

これはタイムスタンプが5分から5時間の時間間隔の範囲内にある可能性があるため、標準の+86400を使用して1日以上経過していないかどうかを確認することができます私がやっている索引作成の大量化2番目のレベルで日付( "d")> $ prevDayを実行するのではなく、新しい日が始まったかどうかを確認するより効率的な方法があるかどうかを確認したいと考えています。

第例えば試験と更新次のよう

echo "Absolute Start: ".date("Y-m-d H:i:s",$start)."<br />"; 
echo "Absolute End: ".date("Y-m-d H:i:s",$end)."<br />"; 
echo "Interval Used: $interval(seconds) OR ".($interval/60)."(minutes)<br />"; 
$numberOfIntervals = ceil(($end - $start)/$interval); 
echo "Number of intervals:$numberOfIntervals<br /><br />"; 
if ($numberOfIntervals > 0){ 
    for ($i = 0; $i < $numberOfIntervals; $i++){ 
     $curStart = $start + ($interval * $i); 
     $curEnd = $curStart + $interval; 
     if ($curEnd > $end){$curEnd = $end;} 
     echo "Interval Start DateTime: ".date("Y-m-d H:i:s",$curStart)."<br />"; 
     echo "Interval End DateTime: ".date("Y-m-d H:i:s",$curEnd)."<br />"; 
/* EXAMPLE PHP5.3 DateTime START - NOT WORKING */ 
     $startDiff = new DateTime("@$curStart"); 
     $endDiff = new DateTime("@$curEnd"); 
     $diff = $startDiff->diff($endDiff); 
     echo $diff->format("%a") . " days<br />"; 
     if ($diff->format("%a") > 0){ 
/* EXAMPLE PHP5.3 DateTime END */ 
/* EXAMPLE Julian START - WORKS */ 
      $days = unixtojd($curEnd) - unixtojd($curStart); 
      echo "Number of days:$days<br />"; 
      if ($days > 0){ 
/* EXAMPLE Julian END */ 
       // Multiple days so the log files are split 
       echo "Multiple days so log files are split<br />"; 
      }else{ 
       echo "Single day so log files are NOT split<br />"; 
      } 
     } 
    } 

出力が見える:

Absolute Start: 2012-01-25 23:59:00 
Absolute End: 2012-01-26 00:02:00 
Interval Used: 180(seconds) OR 3(minutes) 
Number of intervals:1 
Interval Start DateTime: 2012-01-25 23:59:00 
Interval End DateTime: 2012-01-26 00:02:00 

===実施例1 START ===

0 days 
Single day so log files are NOT split 

私はdiffに何かを見逃していますか?

===実施例1 END ===

===実施例3 START ===

Number of days:1 
Multiple days so log files are split 

===実施例3 END ===

+2

2つのタイムスタンプの間の日数は、86400秒が経過していない場合は何も教えてくれませんでした。あなたが与えた日付の例に対して、どんな出力をしたいですか?問題を正確に述べる。 –

+0

日付を取得する方法の1つは、開始日と終了日をテストすることです。例: 'if(date(" d "、$ end_time)> date(" d "、$ start_time)){$ multiDays = true;}それでは、これは最も効率的な方法ですか? –

+0

これは問題です... Apacheログファイルは毎日ローテーションされ、access_log.2012.11.15の形式で保存されます。私のインデクサーアプリはUNIXのタイムスタンプの開始時刻と終了時刻を取るでしょう。複数日にわたることがあります。 PHPを手動でファイル全体を読み込ませるのではなく、私はこれを行うためにUNIXのツール* exec *コマンドを使用しています...だから、私のforループでは、見たい日の変更があればキャッチする方法を見つける必要があります新しいログファイルなぜなら、これらのログファイルをPHPで読んでいない理由のいくつかは、サイズが2 +ギガバイトであり、phpは256mbなので小さなユーザー定義のタイムスパンでインデックスを作成しようとしています。 –

答えて

2

Julian Day

$days = unixtojd($t1) - unixtojd($t2); 

またはあなたがUTCにない場合を使用して...

$days = unixtojd($t1 - $tz) - unixtojd($t2 - $tz); 

ここで、$tzは、秒単位のタイムゾーンオフセットです。

+0

この例では、上記の更新されたコードに基づいて、以下のコードを更新して動作します。*例2を更新した元の投稿* –

+0

これは私のお気に入りの解決方法です。タイムゾーンを自動的に設定するphp iniディレクティブは、追加の2番目のオフセットを考慮に入れますか?私の機能の中で私はそれについて心配する必要はありませんが、ちょうど好奇心が強い...私はiniの指示セットで時間機能をすることが自動的に調整すると思った? –

+0

は一般的にはいですが、ユリウスの日付は天文の概念であり、天文学ではUTCが重要な唯一の時間です –

0

タイムスタンプを最も近い86400秒に丸め、差をとり、86400で割ります。

$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$start_time -= $start_time % 86400; 
$end_time -= $end_time % 86400; 

$days = ($end_time - $start_time)/86400; 

四捨五入によって、その日の真夜中の各タイムスタンプが作成され、その部門はエポックからの日数を返します。ただし、これはUTCでしか動作しません。

2

使用PHP5.3のDateIntervalクラス:

$now = new DateTime(); 
$then = new DateTime("@123456789"); //this is your timestamp 

$diff = $now->diff($then); 

echo "then: " . $then->format("Y-m-d") . "\n"; 
echo $diff->format("%a") . " days\n"; 

出力:

then: 1973-11-29 
13937 days 
+0

オリジナルを更新しました上記の例のように投稿し、それが私が持っている形式では動作しないようです。私はちょうど最初のPHPの日時を割り当てることによって、誤った構文を使用していますか? –

0
<?php 
$start_time = strtotime("2012-01-15 23:59"); 
$end_time = strtotime("2012-01-16 00:05"); 

$time_zone = 19800; # My time zone: UTC+0530 hours = UTC+19800 seconds 

$days = intval(($end_time + $time_zone)/86400) - 
     intval(($start_time + $time_zone)/86400); 

echo "$days\n"; 
?> 
関連する問題