你知道什么时候深夜,你的大脑被炒了?我现在正在进行其中一个夜晚,到目前为止我的功能还没有正常工作,所以请看一下: (我应该注意到我使用的是PHP 5.2.9,并且在PHP 5.3.0之前函数/方法DateTime:Diff()不可用。
<?php
function time_diff($ts1, $ts2) {
# Find The Bigger Number
if ($ts1 == $ts2) {
return '0 Seconds';
} else if ($ts1 > $ts2) {
$large = $ts1;
$small = $ts2;
} else {
$small = $ts1;
$large = $ts2;
}
# Get the Diffrence
$diff = $large - $small;
# Setup The Scope of Time
$s = 1; $ss = 0;
$m = $s * 60; $ms = 0;
$h = $m * 60; $hs = 0;
$d = $h * 24; $ds = 0;
$n = $d * 31; $ns = 0;
$y = $n * 365; $ys = 0;
# Find the Scope
while (($diff - $y) > 0) { $ys++; $diff -= $y; }
while (($diff - $n) > 0) { $ms++; $diff -= $n; }
while (($diff - $d) > 0) { $ds++; $diff -= $d; }
while (($diff - $h) > 0) { $hs++; $diff -= $h; }
while (($diff - $m) > 0) { $ms++; $diff -= $m; }
while (($diff - $s) > 0) { $ss++; $diff -= $s; }
# Print the Results
return "$ys Years, $ns Months, $ds Days, $hs Hours, $ms Minutes & $ss Seconds.";
}
// Test the Function:
ediff(strtotime('December 16, 1988'), time());
# Output Should be:
# 20 Years, 11 Months, 8 Days, X Hours, Y Minutes & Z Seconds.
?>
答案 0 :(得分:2)
这不是你问题的答案,但我只想指出......
while (($diff - $y) > 0) { $ys++; $diff -= $y; }
是一种非常低效的写作方式
$ys = $diff / $y;
$diff = $diff % $y;
另外,这个
else if ($ts1 > $ts2) {
$large = $ts1;
$small = $ts2;
} else {
$small = $ts1;
$large = $ts2;
}
# Get the Diffrence
$diff = $large - $small;
可以很容易地重写为
$diff = abs($ts1 - $ts2);
我觉得如果代码中的问题不那么详细,那么代码中的问题会更明显。 :)
答案 1 :(得分:2)
如何用简单的
简化第一部分$diff = abs($ts2 - $ts1);
然后,当你这样做时:
$n = $d * 31; $ns = 0;
$y = $n * 365; $ys = 0;
你实际上是说一年由365个31天长的月组成。这实际上是大约36年的长度。可能不是你想要的。
最后,我们都是成年人。请使用成熟的变量名称,即$ YEAR_IN_SECONDS而不是$ ys。正如你可以清楚地看到的,你可能会编写一次代码,但其他20个骗子将不得不多次阅读它。
答案 2 :(得分:2)
如果在给定的时间戳期间需要所有月份,那么我们在php中使用以下编码:
function MonthsBetweenTimeStamp($t1, $t2) {
$monthsYear = array();
$lastYearMonth = strtotime(gmdate('F-Y', $t2));
$startYearMonth = strtotime(gmdate('F-Y', $t1));
while ($startYearMonth < $lastYearMonth) {
$monthsYear[] = gmdate("F-Y", $startYearMonth);
//Increment of one month directly
$startYearMonth = strtotime(gmdate("F-Y", $startYearMonth) . ' + 1 month');
}
if (empty($monthsYear)) {
$monthsYear = array($startYearMonth));
}
return $monthsYear;
答案 3 :(得分:1)
这个怎么样:
function time_diff($t1, $t2)
{
$totalSeconds = abs($t1-$t2);
$date = getdate($totalSeconds);
$firstYear = getdate(0);
$years = $date['year']-$firstYear['year'];
$months = $date['mon'];
$days = $date['mday'];
$hours = $date['hour'];
$minutes = $date['minutes'];
$seconds = $date['seconds'];
return "$years Years, $months Months, $days Days, $hours Hours, $minutes Minutes & $seconds Seconds.";
}
这使用给定时间的差异作为日期。然后你可以让“getdate”为你完成所有的工作。唯一的挑战是数年 - 这是简单的最新年份(差异)减去Unix纪元年(1970年)。
如果您不喜欢使用实际月份,您还可以将“年”日除以12个相等月的天数
$months = $date['yday'] / (365/12);
同样,天数可以计算出模数
的剩余天数$days = $date['yday'] % (365/12);