麻烦比较PHP中的日期

时间:2018-02-19 03:54:57

标签: php date calendar comparison

下面的php代码会将所有天显示为PAST,当天除外。我原本以为它只检查了第一个数字,因此在天数中放置2而不是9将会产生每天过去20天的“今天”,但这并没有发生。

http://sandbox.onlinephpfunctions.com/code/fae07419c11f38454de9f3d301cfd1b87816ff82

<?php
$today = date('2018-02-9');
$ym = date('Y-m');
$day_count = date('t');

for ( $day = 1; $day <= $day_count; $day++) {

$date = $ym.'-'.$day;

if ($today == $date) {
    echo "today \r\n";
    echo $date. "\r\n";
    echo $today. "\r\n";
} elseif ($today > $date) {
    echo "PAST \r\n";
     echo $date. "\r\n";
    echo $today. "\r\n";
} else {
    echo "FUTURE \r\n";
     echo $date. "\r\n";
    echo $today. "\r\n";
  }


}

4 个答案:

答案 0 :(得分:1)

date()返回string,因此您的比较是字符串比较,而不是数字(或日期)比较。如果你仔细观察,你会注意到$today在当天缺少一个前导零,所以比较工作意外(记住,这是一个字符串比较)。例如:

$d1 = "2018-02-9";
$d2 = "2018-02-10";
var_dump($d1 > $d2); // true

$d1 = "2018-02-09";
$d2 = "2018-02-10";
var_dump($d1 > $d2); // false

因为,比较到第一个字符串中的9,并在第二个字符串中将其评估为大于1。

您可以通过在9之前添加0并保持字符串比较(仍然会产生意外结果)来修复它,或者将日期转换为时间戳并进行正确的数字比较:

<?php
$today = strtotime(date('2018-02-09'));
$ym = strtotime(date('Y-m'));
$day_count = date('t');

for ( $day = 1; $day <= $day_count; $day++) {
    $date = strtotime(date($ym.'-'.$day));
    if ($today == $date) {
        echo "today \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    } elseif ($today > $date) {
        echo "PAST \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    } else {
        echo "FUTURE \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    }
}

Demo

答案 1 :(得分:0)

如果您只是确保所有日期都采用Y-m-d格式,则无需费心将所有日期转换为时间戳。

代码:(Demo

$today = date('2018-02-09');  // fix your input value to be the standard Y-m-d format
$ym = date('Y-m');
$day_count = date('t');

for ( $day = 1; $day <= $day_count; ++$day ) {
    $date = $ym.'-'.str_pad($day,2,"0",STR_PAD_LEFT);  // just padd the incremented day variable
    if ($today > $date) {
        echo "PAST ";
    } elseif ($today < $date) {
        echo "FUTURE";
    } else {
        echo "TODAY";
    }
    echo " $date & $today\n";
}

输出:

PAST  2018-02-01 & 2018-02-09
PAST  2018-02-02 & 2018-02-09
PAST  2018-02-03 & 2018-02-09
PAST  2018-02-04 & 2018-02-09
PAST  2018-02-05 & 2018-02-09
PAST  2018-02-06 & 2018-02-09
PAST  2018-02-07 & 2018-02-09
PAST  2018-02-08 & 2018-02-09
TODAY 2018-02-09 & 2018-02-09
FUTURE 2018-02-10 & 2018-02-09
FUTURE 2018-02-11 & 2018-02-09
FUTURE 2018-02-12 & 2018-02-09
FUTURE 2018-02-13 & 2018-02-09
FUTURE 2018-02-14 & 2018-02-09
FUTURE 2018-02-15 & 2018-02-09
FUTURE 2018-02-16 & 2018-02-09
FUTURE 2018-02-17 & 2018-02-09
FUTURE 2018-02-18 & 2018-02-09
FUTURE 2018-02-19 & 2018-02-09
FUTURE 2018-02-20 & 2018-02-09
FUTURE 2018-02-21 & 2018-02-09
FUTURE 2018-02-22 & 2018-02-09
FUTURE 2018-02-23 & 2018-02-09
FUTURE 2018-02-24 & 2018-02-09
FUTURE 2018-02-25 & 2018-02-09
FUTURE 2018-02-26 & 2018-02-09
FUTURE 2018-02-27 & 2018-02-09
FUTURE 2018-02-28 & 2018-02-09

答案 2 :(得分:0)

您遇到了日期格式问题。您正在比较没有前导零的天数:“2018-02-9”到具有前导零的天数:“2018-02-09”。

因此,由于您只是将第一个数字与“9”进行比较,因此每个日期将小于9,除了9,这将匹配。当你比较“20”时,比较不会是“20”而是“2”,它会返回过去的结果。

您要在此处执行的操作是协调您的日期格式。在代码中使用日期时,最好的做法是在日期中使用前导零来避免此问题。如果您获得单位数输入,则可以使用strtotime函数

将其转换为两位数

有更好的方法来增加天数,而不是你在这里使用的连接循环(参见here的例子),但我不想让你混淆额外的代码,因为我希望你能够清楚地看到差异。 如下所示,我所做的只是将您的初始第一个日期更改为前导零的双位数格式,然后使用strtotime将您的比较日期更改为前导零格式:

<?php
$today = date('2018-02-09');
$ym = date('Y-m');
$day_count = date('d');

for ( $day = 01; $day <= $day_count; $day++) {

    $date = date('Y-m-d', strtotime($ym.'-'.$day));

    if ($today == $date) {
        echo "today \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    } elseif ($today > $date) {
        echo "PAST \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    } else {
        echo "FUTURE \r\n";
        echo $date. "\r\n";
        echo $today. "\r\n";
    }   

}
?>

沙箱在这里:http://sandbox.onlinephpfunctions.com/code/fae07419c11f38454de9f3d301cfd1b87816ff82

答案 3 :(得分:0)

根据我的理解,您试图在今天的当前月份之前显示今天的所有日期作为过去的日期以及当月的今日美元之后的所有天数,作为未来日期和今天的今日日期作为今天。

您的代码似乎正确,但'&lt;'和'&gt;'比较适用于数字而不是字符串。您需要使用strtotime函数将日期转换为时间戳。