PHP 比较日期变化


php comparing dates for day change

我已经找到了数百个与此类似的主题的问题和答案,但是,没有一个特别符合我的需求,我被难住了。

我有一个 y-m-d 格式的变量,我需要查看它是否是在上一个日历日创建的(不是前一个日历日,而是在前一个日历日(。

即。$tDate = '12-05-2';

如果对象创建于 2012 年 5 月 2 日晚上 11:

59(存储时间(,我需要与 2012 年 5 月 3 日上午 12:01(当前时间(进行比较以等于 true。

如果对象创建于 2012 年 5 月 2 日晚上 11:51

(存储时间(,我需要与 2012 年 5 月 2 日晚上 11:58(当前时间(进行比较以等于 false。

我知道如果这些存储在MySQL数据库中并从字段中提取,MySQL可以很容易地弄清楚。 但是,在这种情况下,该解决方案不是一种选择。

这种比较必须完全在 php 中完成。

我知道这是一个古怪的问题,但是,嘿,这就是StackOverflow的大师擅长的! 期待看到回复!

更新

想通了一下:

    $dTest = '12-05-02';
    $dTest = explode('-',$dTest);
    $dTest2 = date('y-m-d');
    $dTest2 = explode('-',$dTest2);
    if ($dTest[2]<$dTest2[2]){
        echo '<br />Posted Yesterday<br />';
    } else {
        echo '<br />Posted Today<br />';
    }

有没有更有效的解决方案? 似乎有效,但我认为必须有一个更优化/优雅的解决方案?

解决

$tHolder = '12-05-12';
$voteDate = date("y-m-d", strtotime($tHolder));
$today = date("y-m-d", strtotime("today"));
if ($voteDate === $today)
{
   echo "this was today's post";
}
elseif ($voteDate < $today)
{
   echo "this was previous to today";
}

首先 - 我认为您的"解决方案"不起作用。当今天的日期是 12-06-01 而帖子是在 12-05-31 时会发生什么 - 它会给出错误的答案,因为"31">"1">

无论如何 - 我认为正确答案是:

$yesterday =date("y-m-d", strtotime("yesterday"));
$today = date("y-m-d", strtotime("today"));

if ($yesterday === $tDate)
{
   echo "this was yesterdays post";
}
elseif ($today === $tDate)
{
   echo "this was todays post";
}
else
{
    echo "this was NOT yesterday or today":
}

您可以将两个日期转换为 UNIX 时间,然后将其作为整数进行比较:

$day_start = strtotime('-1 day', mktime(0, 0, 0);
$day_finish = strtotime('-1 day', mktime(23, 59, 59);
$dT = strtotime('-1 day', $dTime)
if($dT > $day_start && $dT < $day_finish) {
 var_dump($dT);
} else {
 exit;
}

如果您实际上正在寻找"X天前发布":

$datetime1 = new DateTime('2012-05-01');
$datetime2 = new DateTime('2012-05-02');
$interval = (int)$datetime1->diff($datetime2)->format('%a');
switch ($interval) {
    case 0:
        echo "Posted Today<br />";
        break;
    case 1:
        echo "Posted $interval day ago<br />";
        break;
    default:
        echo "Posted $interval days ago<br />";
}