当用作等式的一部分时,PHP日期时间差的格式问题

当用作等式的一部分时,PHP日期时间差的格式问题,php,mysql,datetime,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", [DateTimeZoneO

我想写一个简单的发票系统。我想使用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生成的$s来输出成本时,我得到了非常奇怪的结果。 有时,从1/3到1/50,我得到了正确的值,比如460.25。很多时候,我只是得到一个随机的字母、数字或符号串,比如:þ50

我发现,如果我将结果重复两次以上,那么在最终输出中,我会完美地得到预期的结果

目前,我的临时修复程序是在getCost()函数中运行:

ob_start();
echo $cost;
echo $cost;
ob_clean();
return $cost;
到目前为止,这似乎解决了问题,我似乎每次都能得到预期的结果,但这有点奇怪

我知道这是等式中的日期时间差,因为如果我用旧式替换它:

strtotime( "Time2FromDatabase") - strtotime( "Time1FromDatabase")
每次都很好用

我还有一个运行总成本:

$totalCost += $cost;
输出$totalCost始终输出正确的值,无论我使用的是DateTime Diff方法还是StrotTime方法

我也尝试过使用intval。(int)和(string)在等式中使用$lenInSec变量之前强制转换该变量,并且该变量无效

有人能提供一些线索来解释为什么会发生这种情况吗?这是PHP的DateTime/Diff类中(n)(未知)的错误吗

编辑:


据我所知,这不是DateTime类中的错误。更有可能的是,它来自代码中的其他地方

根据您提供的代码片段和您的注释,我制作了以下内容:

$totalCost=0;//在示例代码中未初始化,这可能是问题的根源
$dayLength=9;
$rate=425.50;
$ratePerSecond=$rate/($dayLength*3600);
//2天3小时
$date1=新日期时间(“2011-09-10 09:00:00”,新日期时区(“UTC”);
$date2=新日期时间(“2011-11-10 12:00:00”,新日期时区(“UTC”);
$diff=$date2->diff($date1);
$LEINSEC=$diff->format(“%y”)*365*$dayLength*3600+
$diff->format(“%d”)*$dayLength*3600+
$diff->格式(“%h”)*3600+
$diff->format(“%i”)*60+
$diff->format(“%s”);
$cost=$LEINSEC*$ratePerSecond;
$totalCost+=$cost;
回波号_格式($totalCost,2);
它总是产生
141.83


您确实没有提供足够的代码或产生格式问题的具体示例。您提供的代码中没有任何内容会导致随机的字母、数字或符号字符串。

您确定使用的日期时间格式相同吗?尝试使用
DateTime::createFromFormat()
方法。除此之外。。。除非您可以用
%a
(总天数)替换
%y
%d
,我认为您没有任何问题。
DateTime::diff()
的用户评论中有许多关于错误货币的警告,由于这是一个相对较新的PHP扩展,我想这可能是一个错误。好的,谢谢。我会尝试一下你的建议,然后再向你汇报。虽然我很确定它们的日期时间格式是一样的。它们都来自Mysql数据库中的datetime字段。很遗憾,CreateFromFormat()没有更改任何内容。我指的是从数据库中获取的格式与PHP的datetime接受的默认格式相比。@Narf:您的第一条注释可能是答案。:)基本上,我有一个大约1000行长的脚本来生成整个发票。通过尝试和错误,我发现成本计算代码是问题所在。我制作了一个新文件,其中只包含成本计算代码,这是我在这里给出的~11行代码。我用硬编码的值运行脚本,以确保它在其他地方没有问题,我仍然有问题。当这是产生问题所需的最小值时,我不认为给你更多的代码会有什么帮助。如果不是DateTime类的话,剩下的唯一一个可能性是我的服务器设置,但我不知道什么设置可以做到这一点。好的,所以我只是在我的live server上运行了代码(大约50次),它每次都返回正确的值。您知道是什么原因导致我的测试服务器(Xampplite 1.7.3)出现此问题吗?恐怕我不知道。我无法用你提供的任何东西重现这个问题。您可以尝试打开错误报告(如果还没有),看看是否有任何异常。我怀疑您的一个变量被视为字符串而不是数字。由于在您提供的代码段中有几个变量未初始化,因此我必须假设它们在其他地方初始化。这可能是造成问题的原因。我很抱歉。我希望我能帮上更多的忙。
$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 */