2012-01-27 4 views
1

아니요 표준 사이의 날짜가 아닌 +86400 초입니다.PHP의 두 유닉스 타임 스탬프 사이의 실제 일수

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

$ daysInBetweenTimestamps =?

타임 스탬프가 5 분에서 5 시간 사이의 범위 일 수 있으므로 현재 문제가 있습니다. 표준 이상으로 86400을 사용하면 하루 이상 작동하는지 확인할 수 없습니다. 엄청난 양의 색인 생성 두 번째 수준에서 날짜 ("d")> $ prevDay 대신 새로운 날이 시작되었는지 확인하는 더 효율적인 방법이 있는지보고 싶습니다. 첫 번째 예에 대한 시험과 함께 업데이트

:

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 개 스타트 ===에게

0 days 
Single day so log files are NOT split 

다음과 같이

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 />"; 
      } 
     } 
    } 

출력 보인다 나는 diff에서 뭔가를 놓치고 있습니까?

=== 예 1 END ===

=== 예 3의 START ===

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

=== 예 3 END ===

+2

86400 초가 경과하지 않은 경우 두 개의 시간 소인 사이의 일 수를 알려주지 않았습니다. 당신이 준 예제 날짜에 대해 어떤 결과물을 원하십니까? 문제를 정확하게 기술하십시오. –

+0

날짜를 얻는 한 가지 방법은 시작과 끝, 예 :'if (date ("d", $ end_time)> date ("d", $ start_time)) {$ multiDays = true;}에서 테스트하는 것입니다. '그리고 나서 각각의 마지막 두 번째 카운트와 루프를 반복하는 것이 가장 효율적인 방법입니까? –

+0

문제는 이것입니다 ... 아파치 로그 파일은 매일 로테이션되고 access_log.2012.11.15의 형식으로 저장됩니다. 내 인덱서 응용 프로그램은 유닉스 타임 스탬프 시작 및 종료 시간이 걸립니다. 여러 날에 걸쳐있을 수 있습니다. 대신 PHP를 수동으로 전체 파일을 읽는 데 사용하기 위해 유닉스 도구 * exec * 명령을 사용합니다. 그래서 for 루프를 보았습니다. 새로운 로그 파일 php로이 로그 파일을 읽지 않는 이유 중 일부는 2 + gig 크기이고 php는 256MB이므로 작은 사용자 정의 시간 간격으로 인덱스를 작성하려고합니다 –

답변

2

사용 Julian Day

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

또는 UTC에없는 경우 ...

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

여기에서 $tz은 시간대 오프셋 (초)입니다.

+0

이 예제는 위의 업데이트 된 코드를 기반으로 다음 코드 업데이트를 기반으로 작동합니다. * 예 2의 업데이트 된 원본 게시물 * –

+0

이것은 단순함으로 인해 가장 좋아하는 솔루션 인 것으로 나타났습니다. 시간대를 자동으로 설정하는 php ini 지시문은 추가 두 번째 오프셋을 고려합니다. 내 함수 내에서 나는 그것에 대해 걱정할 필요는 없지만 단지 궁금해서 ... 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 datetime을 할당하여 잘못된 구문을 사용하고 있습니까? –

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"; 
?> 
관련 문제