我正在使用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)它仍然着色为红色
答案 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
<强>文档强>
strtotime
- http://www.php.net/manual/en/function.strtotime.php DateTime::__construct
- http://www.php.net/manual/en/datetime.construct.php date
(文档格式字符串) - http://php.net/manual/en/function.date.php abs
- http://www.php.net/manual/en/function.abs.php 答案 1 :(得分:0)
我尝试了你的代码,当我传递“非数值”时它返回红色,所以,我试过
echo (int)$wks_to_turnover;
并返回'0',原因是因为日期尚未作为整数返回。
使用您的方法快速解决此问题
替换该行:
$wks_to_turnover = date_diff($datetime1, $datetime2);
与此:
$wks_to_turnover = strtotime($datetime1)-strtotime($datetime2);
它会以秒为单位返回差异,你可以从这里处理它