使用php基于截止日期突出显示行

时间:2017-06-07 02:22:32

标签: php date datediff

我对PHP比较陌生,我已经学习了程序化PHP,而且我正在玩一个应用程序。

我查看了网站,发现了几个关于日期格式化和使用PHP,HTML和CSS突出显示的示例。

借助此处提供的帮助和PHP手册,我已经汇总了一些代码,以突出显示由遵循此标准的数据库提供的许​​多其他行中的2个不同行:

  • 1天(今天,昨天,上周等)到期的任何事情都应该将表格的颜色设为红色。
  • 3天外(将来1天到3天之间)的任何东西都应该将桌子的行涂成黄色。
  • 其他任何东西都应该使用bootstrap" table-striped"样式。

以下是我放在一起的代码

//Today + 1 day
$oneDay = date('m/d/Y', strtotime("+1 day"));
//Today + 3 days
$threeDays = date('m/d/Y', strtotime("+3 days"));

//Database entry for comparison
$due = date_create($record['projected_delivery']);

$dueOneDay = date_create($oneDay);
$dueThreeDays = date_create($threeDays);

//Get the difference between the 2 dates
$diffOne = date_diff($due, $dueOneDay);
$diffThree = date_diff($due, $dueThreeDays);

if ($diffThree->format('%d') < 3) {
   $highlight_css = " warning";
}elseif ($diffOne->format('%d') <= 1){
   $highlight_css = " danger";
}else {
   $highlight_css = "";
}

然后我将$highlight_css添加到HTML。

到目前为止,部分的功能正在发挥作用。未添加适当的突出显示:

  • 超过1天的日期(即昨天,上周)

如何实现此功能?

3 个答案:

答案 0 :(得分:0)

$diffThree->format('%d')

将返回一个字符串而不是一个整数。为了将其与其他数字(在您的情况下为3和1)正确比较,您需要将其转换为int:

(int) $diffThree->format('%d')

(int) $diffOne->format('%d')

答案 1 :(得分:0)

我会改用它:

<?php

$dueDates =["06/05/2017","06/06/2017","06/07/2017","06/08/2017","06/09/2017","06/10/2017","06/11/2017","06/12/2017"];
$table = "<table class='table table-bordered'><thead><tr><th>Date</th></tr></thead><tbody>";
$today = date_create(date('m/d/Y')); // example: 06/07/2017
foreach ($dueDates as $dueStr) {
    $due = date_create($dueStr);
    $diff = date_diff($today, $due)->format("%r%a");
    $highlight_css = "";
    if ($diff > 1 && $diff <= 3) {
        $highlight_css = " warning";
    } elseif ($diff == 1) {
        $highlight_css = " danger";
    }
    $table .= "<tr class='$highlight_css'><td>$dueStr</td></tr>";
}
$table .= "</tbody></table>";
?>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" >
<?php
echo $table;

enter image description here

答案 2 :(得分:0)

问题

DateIntervaldate_diff()的返回值)具有天数(实际存储在属性d中,可以使用而不是获取{{3}的字符串}}),应始终为正数。对于今天日期之前的日期,第一个日期差异(即$diffOne)将为2天以上,第二个日期差异(即$diffThreeDays)将为4+(请参阅format()并进行调试表格上方的输出)根据给定的逻辑,今天的日期前几天永远不会与“警告”或“危险”相关联。

解决方案

比较日期的一种方法(可能更简单)是使用this playground example

  

注意:

     

从PHP 5.2.2开始,可以使用DateTime comparison比较DateTime对象。 comparison operators

因此比较DateTime变量(即$due$dueOneDay$dueThreeDays)而不是日期差异。

在下面的逻辑中,您会注意到比较的顺序已被颠倒,因此在检查三天差异之前检查一天差异,以避免危险情况永远不会发生。

if ($due < $dueOneDay){
   $highlight_css = " danger";
}else if ($due <= $dueThreeDays) {
   $highlight_css = " warning";
}else {
   $highlight_css = "";
}

使用这种方法,不需要date_diff变量(即$diffOne$diffThree)。

请参阅1中的演示。

1 <子> this playground example