0

我正在使用 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) 它仍然是红色的

4

2 回答 2

1

请注意,这<input type="string" />不是有效的 HTML——您正在寻找type="text"

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

笔记:

m/d/y 或 dmy 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.),则假定为欧洲 dmy 格式。

为避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 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';
}

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

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

文档

于 2013-11-08T04:23:14.433 回答
0

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

    echo (int)$wks_to_turnover;

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

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

替换该行:

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

接着就,随即 :

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

它会在几秒钟内返回差异,你可以从这里处理它

于 2013-11-08T04:37:35.127 回答