不确定我的代码有什么问题

时间:2013-11-08 04:02:27

标签: php css

我正在使用php $ _GET

传递日期输入
<form action="trigger_date.php" method="get">
Enter Project Turnover date (mm/dd/yy): <input type="string" name="date"> <input type="submit">

在trigger_date.php中将其视为

<?php $turnover_date = $_GET['date']; ?>

我做了一些数学计算,将它与今天的日期进行比较

<?php 
$project_turnover = strtotime($turnover_date);
$project_turnover = date ("m/d/y", $project_turnover);
?>
<?php 
$datetime1 = date_create($today);
$datetime2 = date_create($project_turnover);
$wks_to_turnover = date_diff($datetime1, $datetime2); // taking the difference between today and project turnover date
$wks_to_turnover = $wks_to_turnover->format('%R%a'); 
$wks_to_turnover = ($wks_to_turnover/7);
$wks_to_turnover = round($wks_to_turnover,1); //with input of 5/1/14 this should be roughly 24 wks
?>

这是我难倒的地方,我的造型是:

<?php
if ($wks_to_turnover > 2) {
echo $date_green; // colors the background green 
} elseif (2 > $wks_to_turnover && $wks_to_turnover > 0) {
echo $date_yellow; // colors the background yellow
} elseif (0 >= $wks_to_turnover) { 
    echo $date_red; //colors the background red
} ?>;

但即使(24> 2)它仍然着色为红色

2 个答案:

答案 0 :(得分:1)

请注意,<input type="string" />无效HTML - 您正在寻找type="text"

date_create接受几种不同格式的日期。您在输入日期使用的m/d/y格式是不好的格式,因为它不明确。根据手册:

  

注意:

     

通过查看,可以消除m / d / y或d-m-y格式的日期   各个组件之间的分隔符:如果分隔符是a   斜线(/),然后是美国m / d / y;而如果   separator是短划线( - )或点(。),然后是欧洲d-m-y格式   假定。

     

为避免潜在的歧义,最好使用ISO 8601(YYYY-MM-DD)   date或DateTime :: createFromFormat()尽可能。

使用Date对象支持的标准化日期格式。它可能不是您的问题的原因,但在代码中明确是明智的。

我不完全确定为什么要将输入转换为UNIX时间戳然后再转换为格式化日期。您可以简单地使用从输入中获得的格式化日期,该日期似乎是受支持的格式,并处理可能产生的任何错误。

最后,你的数学产生一个负数。 这就是为什么你的逻辑无法按预期行事的原因之一。你可以改变传递给date_diff的参数的顺序,或者使用abs来获得两者之间的绝对距离日期。我选择了abs,如果2周是过去或未来,那么代码就不在乎了。我不知道你在这里做什么 - 也许标志很重要。如果是,请颠倒传递给date_diff

的参数的顺序

编辑:OP澄清abs无法满足他的需求,并相应调整)

把它放在一起,我建议像这样:

$datetime1 = date_create('now');
$datetime2 = date_create(
array_key_exists(
    'date',
    $_GET
    ) ? $_GET['date'] : 'invalid'
);
if (!$datetime2)
    die('invalid date');
$wks_to_turnover = date_diff($datetime2, $datetime1);
$wks_to_turnover = $wks_to_turnover->format('%R%a'); 
$wks_to_turnover = ($wks_to_turnover/7);
$wks_to_turnover = round($wks_to_turnover,1);be roughly 24 wks

if ($wks_to_turnover <= 0) {
    echo 'green';
} elseif ($wks_to_turnover < 2 && $wks_to_turnover > 0) {
    echo 'yellow';
} else {
    echo 'red';
}

我还调整了if s的最后一个块 - 如果周小于或等于零,绿色,如果小于2但大于0黄色,否则为红色。

试一试:http://codepad.viper-7.com/kLN5jk

<强>文档

答案 1 :(得分:0)

我尝试了你的代码,当我传递“非数值”时它返回红色,所以,我试过

    echo (int)$wks_to_turnover;

并返回'0',原因是因为日期尚未作为整数返回。

使用您的方法快速解决此问题

替换该行:

    $wks_to_turnover = date_diff($datetime1, $datetime2);

与此:

    $wks_to_turnover = strtotime($datetime1)-strtotime($datetime2);

它会以秒为单位返回差异,你可以从这里处理它