我正在尝试编写一个简单的发票系统。我想使用DateTime Diff来计算每张发票的成本。
到目前为止,我有:
/* In this example $dayLength and $ratePerSec don't really matter but we will use the
hypotethical values of 8.0 and 0.0054 for now */
$date1 = new DateTime( "Time1FromDatabase", [DateTimeZoneOfChoice] );
$date2 = new DateTime( "Time2FromDatabase", [DateTimeZoneOfChoice] );
$diff = $date2->diff( $date1 );
$lenInSec = $diff->format("%y")*365*$dayLength*3600 +
$diff->format("%d")*$dayLength*3600 +
$diff->format("%h")*3600 +
$diff->format("%i")*60 +
$diff->format("%s");
$cost = $lenInSec * $ratePerSecond;
当我尝试使用从DateTime Diff生成的$ lenInSec输出成本时,我得到了非常奇怪的结果。 有时,从1比3和1比50的任何地方,我得到正确的值460.25。很多时候我只是随机获得一串字母,数字或符号,例如:þ50。
我发现如果我将结果回显2次以上,那么在最终输出中我会得到完美的预期结果。
目前我的临时修复是在getCost()函数中运行:
ob_start();
echo $cost;
echo $cost;
ob_clean();
return $cost;
到目前为止,这似乎解决了这个问题,我似乎每次都得到预期的结果,但这有点奇怪。
我知道这是等式中的DateTime Diff,因为如果我用旧式替换它:
strtotime( "Time2FromDatabase") - strtotime( "Time1FromDatabase")
每次都很完美。
我的总费用也是如此:
$totalCost += $cost;
无论是使用DateTime Diff方法还是使用strtotime方法,输出$ totalCost始终输出正确的值。
我也尝试过使用intval。 (int)和(string)在$ lenInSec变量中强制转换,然后在等式中使用它并且它没有效果。
任何人都可以提供任何线索,说明为什么会这样吗?它是PHP的DateTime / Diff类中的(n)(未知)错误吗?
编辑:
$date1 = new DateTime( "2011-09-04 09:00:00", new DateTimeZone("UTC") );
$date2 = new DateTime( "2011-09-04 18:00:00", new DateTimeZone("UTC") );
//Essentially 1 day of work
$rate = 200.00; //Per Day
$ratePerSec = 0.00617283950617283950617283950617;
// $rate / (9 hours * 3600 seconds )
$lenInSec = 32400; // From the diff calculation
$cost = $lenInSec * $ratePerSec; // Cost should now equal 200.
echo $cost; // Sometimes outputs 8, other times 200, other times þ50.
//I think the þ50 is when you have a number like 425.50 where þ is the 425.
$totalCost += $cost;
echo number_format($totalCost,2); /* Will return the correct
value of all the $cost variables added no matter what the individual $cost
variables are output as, in this case 200.00 */
答案 0 :(得分:0)
据我所知,这不是DateTime类中的错误。更有可能的是,它源于代码中的其他位置。
根据您提供的代码片段和您的评论,我制作了这个:
$totalCost = 0; // uninitialized in your sample code, potential source of problem
$dayLength = 9;
$rate = 425.50;
$ratePerSecond = $rate / ($dayLength * 3600);
// 2 days, 3 hours
$date1 = new DateTime( "2011-09-10 09:00:00", new DateTimeZone("UTC") );
$date2 = new DateTime( "2011-11-10 12:00:00", new DateTimeZone("UTC") );
$diff = $date2->diff( $date1 );
$lenInSec = $diff->format("%y")*365*$dayLength*3600 +
$diff->format("%d")*$dayLength*3600 +
$diff->format("%h")*3600 +
$diff->format("%i")*60 +
$diff->format("%s");
$cost = $lenInSec * $ratePerSecond;
$totalCost += $cost;
echo number_format($totalCost,2);
始终会产生141.83
。
您实际上没有提供足够的代码或具体的示例来产生格式问题。您提供的代码中的任何都不应该导致随机的字母,数字或符号字符串。