2011-06-09 13 views
5

(看起来我的环境/系统出了问题,我现在正在分析它,每个逻辑答案都被尝试过了,失败了,所以一旦我有更多的分享,就会报告回来。感谢您的回答!)PHP中的基本整数划分失败 - 很难

我已经写了一些简单的PHP代码来计算两个日期之间的持续时间,并做一些基本的算术运算,来计算一些百分比值。

我对此失效的线索感到失望!在我看来,一个变量在一行上被视为一个整数,在另一行上被视为一个字符串。

$start_DT = new DateTime($startdate); // e.g. 2011-06-07 
$end_DT = new DateTime($enddate); // e.g. 2011-06-14 
$today_DT = new DateTime("now");  // 2011-06-09 

$duration  = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining; // This outputs a value of "4" in my specific case 
echo $duration;  // This outputs a value of "7" for my specific case. 

$percentage_dur_complete = $days_remaining/$duration; 

echo $percentage_dur_complete; // This gives a value of NAN 

// This line says that I am dividing my zero, to imply that 
// $duration might be a string. 
$percentage_dur_complete = $days_remaining/(float) $duration; 

我是否缺少一些基本的东西?我是PHP的相对新手(2个月)。我真的希望(有可能看起来很愚蠢),我错过了一些东西。

谢谢!

+1

在除法之前检查每个变量的类型的一种方法是使用'var_dump($ myvar)',它会告诉你'$ myvar'的类型和值。更多信息在这里:http://php.net/manual/en/function.var-dump.php – n00dle 2011-06-09 21:59:34

+0

如果我做'var_dump',那么这两个数字都是整数,'$ percentage_dur_complete'包含一个合适的数字。一定还有其他的错误。你确定'$ startdate'和'$ enddate'设置正确吗? – 2011-06-09 22:02:52

+0

为了进行完整性检查,您运行的是哪个版本的PHP? – 2011-06-09 22:05:25

回答

2

尝试

$percentage_dur_complete = (int)$days_remaining/(int)$duration; 

编辑: 这对我的作品......

<?php 
$startdate = '2011-06-05'; 
$enddate = '2011-06-12'; 
$today_DT = new DateTime("now"); 
$start_DT = new DateTime($startdate); // e.g. 2011-06-07 
$end_DT = new DateTime($enddate); 
$duration  = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 
var_dump ($duration); 
var_dump ($days_remaining); 
$percentage_dur_complete = $days_remaining/$duration *100; 
echo ($percentage_dur_complete); 
?> 

如果它不适合你,这是最肯定的问题与你的PHP安装/版本!

+0

我也试过了。试了一遍,仍然给我南 – 2011-06-09 22:01:58

+0

睡眠不起作用,但我想知道为什么它是有道理的补充?似乎有点不相关? – 2011-06-09 22:32:53

+0

只是一个预感...... D – 2011-06-09 22:33:56

0

我把你的代码,并修改了一点(格式化输出,但更重要的是通过直接串入DateTime功能):

$start_DT = new DateTime('2011-06-07'); 

$end_DT = new DateTime('2011-06-14'); 

$today_DT = new DateTime("now"); 

$duration = date_diff($end_DT, $start_DT)->d; 

$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining . "<br>"; 

echo $duration . "<br>"; 

$percentage_dur_complete = $days_remaining/$duration; 

echo $percentage_dur_complete . "<br>"; 

$percentage_dur_complete = $days_remaining/(float) $duration; 

echo $percentage_dur_complete . "<br>"; 

而且我得到的输出看起来像这样:

5 
7 
0.71428571428571 
0.71428571428571 

我的预感是,你没有通过你认为你通过生成$start_DT$end_DT

+0

我试过了。什么更奇怪(呃)是每个其他操作与$持续时间失败,并且其他所有工作。 所以,如果我为$ duration添加额外的回声,我自己的代码工作正常。想不通为什么 – 2011-06-09 22:07:02

+0

我不确定你的意思?你是说它在工作和不工作之间交替? – 2011-06-09 22:08:17

+0

所以,如果我复制粘贴代码按,这是我得到: NAN 0.42857142857143 – 2011-06-09 22:08:44

0

我敢打赌,DateTime的构造函数在传入日期时遇到了问题。试试这个:

$startdate = "2011-06-07"; 
$enddate = "2011-06-14"; 

$start_DT = DateTime::createFromFormat('Y-m-j',$startdate); 
$end_DT = DateTime::createFromFormat('Y-m-j',$enddate); 
$today_DT = new DateTime("now"); 

$duration = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining . "<br>\n"; 
echo $duration . "<br>\n"; 

$percentage_dur_complete = $days_remaining/$duration; 
echo $percentage_dur_complete . "<br>\n"; 

$percentage_dur_complete = $days_remaining/(float) $duration; 
echo $percentage_dur_complete . "<br>\n"; 

确保格式字符串匹配你如何在你的日期字符串传递(即“J”天与领先的零,“d”几天都没有)。

+0

谢谢。这工作了一下,然后停止工作。我认为我的安装有问题。将重新安装所有/在不同的系统上尝试它。即使我按照原样使用代码,它也会间歇性地工作。让我相信它的我的系统 – 2011-06-09 23:57:37

0

我有同样的问题。我使用的是PHP 5.3.1,我升级到5.4.17来解决这个问题。不要浪费时间试图寻找像我最初那样的解决方法。

+0

是真正与date_diff问题相关的答案,这个问题暴露在问题中? – emecas 2013-04-10 14:28:04