PHP DateTime格式化问题用作方程式的一部分时的差异

时间:2011-09-02 17:44:33

标签: php mysql datetime

我正在尝试编写一个简单的发票系统。我想使用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 */

1 个答案:

答案 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

您实际上没有提供足够的代码或具体的示例来产生格式问题。您提供的代码中的任何都不应该导致随机的字母,数字或符号字符串。