【问题标题】:Not sure what's wrong with my code不确定我的代码有什么问题
【发布时间】:2013-11-08 04:02:27
【问题描述】:

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

【问题讨论】:

  • 你怎么知道$wks_to_turnover实际上被正确计算了?这部分代码看起来不错(减去最后一条注释前面缺少 //)。
  • $wks_to_turnover 的值是多少? var_dump($wks_to_turnover);
  • 当我手动输入“5/1/14”而不是使用 $_GET 方法时,样式效果很好。我还在表格中输出$wks_to_turnover 的值作为我的健全性检查,所以
  • $turnover_date$project_turnover ??我想你在$turnover_date 中获取日期并使用$project_turnover 进行计算?
  • $turnover_date 是 $_GET 和 $project_turnover = date ("m/d/y", $project_turnover)

标签: php css


【解决方案1】:

请注意,&lt;input type="string" /&gt; 不是有效的 HTML - 您正在寻找 type="text"

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

注意:

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

为避免潜在的歧义,最好使用 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';
}

我还调整了ifs 的最后一个块——如果weeks 小于或等于0,则为绿色,如果小于2 但大于0,则为黄色,否则为红色。

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

文档

【讨论】:

  • 将日期输入更改为'Y-m-d' 格式仍然无法使样式正常工作。所以 (24 &gt; 2) 在应该是绿色的时候仍然是红色的
  • 旁注:使用DateTime::createFromFormat()比较日期时,请使用UTC时区以避免时区偏移和默认时区夏令时导致的意外结果。
  • @eg-dev-newbie 只是一个疯狂的想法,你检查过$date_green 真的是绿色的吗?
  • @eg-dev-newbie 使用代码示例检查编辑。我忽略了一个明显的逻辑问题:)
  • @eg-dev-newbie Aaaand ifs 的另一个问题。再次编辑! :P
【解决方案2】:

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

    echo (int)$wks_to_turnover;

它返回 '0' ,原因是日期还没有作为整数返回。

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

替换该行:

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

这样:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多