2012-01-27 63 views
1

不,这不是日期之间的标准+86400秒。PHP中两个unix时间戳之间的实际天数

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

$ daysInBetweenTimestamps =?

这就是我目前面临的问题,因为时间戳可能介于5分钟到5小时之间,例如使用标准+86400来查看它是否超过一天不会工作,并且由于我在做的大量索引我想看看是否有更有效的方法来检查新的一天是否已经开始,而不是在第二级上执行日期(“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 

我只是缺少差异的东西?

===实施例1 END ===

===实施例3 START ===

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

===实施例3 END ===

+2

如果没有经过86400秒的时间,您没有告诉我们两个时间戳之间的天数是多少。你想给你的例子日期输出什么。准确地说明问题。 – 2012-01-27 15:22:30

+0

获取日期的一种方法是在开始和结束时进行测试,例如:if(date(“d”,$ end_time)> date(“d”,$ start_time)){$ multiDays = true;} '然后做每一天的最后一秒计数和它们之间的循环,这是最有效的方法吗?' – 2012-01-27 15:25:56

+0

所以问题是这样的... Apache日志文件每天轮换并以access_log.2012.11.15格式保存,我的索引器应用程序需要一个unix时间戳开始和结束时间。这可能会跨越多天。与其让php手动读取整个文件,我使用unix工具* exec *命令为我完成这项工作...因此,在我的for循环中,我需要找到一种方法来捕捉是否需要改变几天来查看新的日志文件。不使用php读取这些日志文件的原因是其中一些是2 + gig的大小和php有256mb,所以我尝试在一个小的用户定义的时间范围内索引 – 2012-01-27 15:30:31

回答

2

使用Julian Day

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

,或者如果你是不是在UTC ...

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

其中$tz是您的以秒为单位的时区偏移量。

+0

这个例子的工作基于我上面更新的代码,对代码进行了以下更新:*参见更新原始文章中的示例2 * – 2012-01-27 17:34:05

+0

这似乎是我最喜欢的解决方案,因为它很简单,但是一个简单的问题,不是php ini指令自动设置时区并考虑附加的第二偏移量?在我的函数中,我不需要担心它,但只是好奇......我认为使用ini指令集进行时间函数会自动调整? – 2012-01-27 18:15:59

+0

通常是的,但朱利安日期是一个天文学概念,并且在天文学中UTC是唯一重要的时间 – 2012-01-28 15:03:56

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

Updated my original发布上面的这个例子,并显示它不工作在我有它的格式。我只是通过分配第一个PHP日期时间来使用不正确的语法? – 2012-01-27 17:28:33

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"; 
?>