【问题标题】:PHP: How to check if a date is today, yesterday or tomorrowPHP:如何检查日期是今天、昨天还是明天
【发布时间】:2014-10-26 15:48:15
【问题描述】:

我想检查日期是今天、明天、昨天还是其他。 但是我的代码不起作用。

代码:

$timestamp = "2014.09.02T13:34";
$date = date("d.m.Y H:i");
$match_date = date('d.m.Y H:i', strtotime($timestamp));

if($date == $match_date) { 

    //Today

} elseif(strtotime("-1 day", $date) == $match_date) {

    //Yesterday

} elseif(strtotime("+1 day", $date) == $match_date) {

    //Tomorrow

} else {

    //Sometime

}

代码总是在 else 情况下。

【问题讨论】:

  • $timestamp 是如何定义的以及在哪里定义的?
  • 使用 strtotime 检查日期
  • 我建议你看看 Datetime 对象。而且很可能你的 $timestamp 没有被正确转换。
  • $timestamp 就像"2014.09.02T13:34"

标签: php date time strtotime


【解决方案1】:

首先。你有错误使用函数strtotimePHP documentation

int strtotime ( string $time [, int $now = time() ] )

您需要修改代码以将整数时间戳传递给此函数。

Second.您使用包含时间部分的格式d.m.Y H:i。如果您只想比较日期,则必须删除时间部分,例如`$date = date("d.m.Y");``

第三个。我不确定它是否对你有同样的效果,但我的 PHP 不理解 $timestamp 的日期格式并返回 01.01.1970 02:00 转入$match_date

$timestamp = "2014.09.02T13:34";
date('d.m.Y H:i', strtotime($timestamp)) === "01.01.1970 02:00";

您需要检查strtotime($timestamp) 是否返回正确的日期字符串。如果否,您需要指定$timestamp 变量中使用的格式。您可以使用date_parse_from_formatDateTime::createFromFormat 之一的函数来完成此操作

这是一个工作示例:

$timestamp = "2014.09.02T13:34";

$today = new DateTime("today"); // This object represents current date/time with time set to midnight

$match_date = DateTime::createFromFormat( "Y.m.d\\TH:i", $timestamp );
$match_date->setTime( 0, 0, 0 ); // set time part to midnight, in order to prevent partial comparison

$diff = $today->diff( $match_date );
$diffDays = (integer)$diff->format( "%R%a" ); // Extract days count in interval

switch( $diffDays ) {
    case 0:
        echo "//Today";
        break;
    case -1:
        echo "//Yesterday";
        break;
    case +1:
        echo "//Tomorrow";
        break;
    default:
        echo "//Sometime";
}

【讨论】:

  • 哪种case 会导致switch 中出现“有时”?只有当$today$match_date 没有正确格式化为日期时,也许?
  • 一个可能的改进:$today 可以定义为 new DateTime("today"),这意味着今天午夜 -- 时间部分将自动归零。
  • 单独检查 (integer)$diff->format( "%R%a" ) == 0 是不准确的。十年前的同一天也是如此。今天检查$diff->days == 0,昨天/明天检查$diff->days == 1$diff->invert
【解决方案2】:
<?php 
 $current = strtotime(date("Y-m-d"));
 $date    = strtotime("2014-09-05");

 $datediff = $date - $current;
 $difference = floor($datediff/(60*60*24));
 if($difference==0)
 {
    echo 'today';
 }
 else if($difference > 1)
 {
    echo 'Future Date';
 }
 else if($difference > 0)
 {
    echo 'tomorrow';
 }
 else if($difference < -1)
 {
    echo 'Long Back';
 }
 else
 {
    echo 'yesterday';
 }  
?>

【讨论】:

  • 每次在代码中看到数字 86400 (60 * 60 * 24) 就知道它有 bug。在这种情况下也是如此:ideone.com/2D2N8I
  • @Jon :为什么这个数字被认为是一个错误?
  • @DeepakJain 因为并非所有的日子都是 86400 秒长。由于夏令时,有更短的日子和更长的日子,有闰秒,所有这些当然很少发生,但当它们发生时它们会破坏你的代码。例如,如果您选择某些特定日期,请参见我在上面给出的 ideone 链接中此代码如何报告错误结果。
  • 感谢@Jon 的解释!我会记下它,因为这似乎很重要。
  • 你确定这有效吗?如果日期属于 17 小时前,假设是 4PM ,它属于昨天,但您的代码将显示 Today
【解决方案3】:

我认为这会对你有所帮助:

<?php
$date = new DateTime();
$match_date = new DateTime($timestamp);
$interval = $date->diff($match_date);

if($interval->days == 0) {

    //Today

} elseif($interval->days == 1) {
    if($interval->invert == 0) {
        //Yesterday
    } else {
        //Tomorrow
    }
} else {
    //Sometime
}

【讨论】:

  • 这很好用。只是一个警告,它并不总是准确的。例如,如果现在的时间是上午 10:30,昨天的时间是上午 10:58,则 $interval->days == 0,这使得该日期看起来是“今天”,这是不正确的。
  • 这不是检查“今天”,而是检查“过去 24 小时”
  • 今天不是日期之间的差异。今天是同一天。
【解决方案4】:

在 PHP 中没有内置函数可以做到这一点(耻辱 ^^)。您想将日期字符串与今天进行比较,您可以使用简单的substr 来实现它:

if (substr($timestamp, 0, 10) === date('Y.m.d')) { today }
elseif (substr($timestamp, 0, 10) === date('Y.m.d', strtotime('-1 day')) { yesterday }

没有日期转换,简单。

【讨论】:

  • 如果你有整数,你为什么要比较字符串? :D 顺便说一句,哪种语言有这样的功能?
  • @IvankaTodorova Swift 做到了!
【解决方案5】:
function getRangeDateString($timestamp) {
    if ($timestamp) {
        $currentTime=strtotime('today');
        // Reset time to 00:00:00
        $timestamp=strtotime(date('Y-m-d 00:00:00',$timestamp));
        $days=round(($timestamp-$currentTime)/86400);
        switch($days) {
            case '0';
                return 'Today';
                break;
            case '-1';
                return 'Yesterday';
                break;
            case '-2';
                return 'Day before yesterday';
                break;
            case '1';
                return 'Tomorrow';
                break;
            case '2';
                return 'Day after tomorrow';
                break;
            default:
                if ($days > 0) {
                    return 'In '.$days.' days';
                } else {
                    return ($days*-1).' days ago';
                }
                break;
        }
    }
}

【讨论】:

    【解决方案6】:

    今天/昨天/明天的简单一个班轮:

    $someDate = '2021-11-07'; // date in any format
    
    $isToday = date('Ymd') == date('Ymd', strtotime($someDate));
    $isYesterday = date('Ymd') == date('Ymd', strtotime($someDate) + 86400);
    $isTomorrow = date('Ymd') == date('Ymd', strtotime($someDate) - 86400);
    

    【讨论】:

      【解决方案7】:

      将日期传递给函数。

                  <?php
                      function getTheDay($date)
                      {
                          $curr_date=strtotime(date("Y-m-d H:i:s"));
                          $the_date=strtotime($date);
                          $diff=floor(($curr_date-$the_date)/(60*60*24));
                          switch($diff)
                          {
                              case 0:
                                  return "Today";
                                  break;
                              case 1:
                                  return "Yesterday";
                                  break;
                              default:
                                  return $diff." Days ago";
                          }
                      }
                  ?>
      

      【讨论】:

      • 除了,这真的是寻找超过24小时的差异。如果您检查昨天下午的时间与今天早上相比,它应该说昨天。关键是忽略时间部分,只看日期。如果您使用date('Y-m-d') 格式化每个日期,那么它将比较每天的午夜,它们将相等或相隔24 小时的倍数。从技术上讲,您也不需要floor() 函数。
      【解决方案8】:

      这是已接受答案的更完善的版本。 它只接受时间戳,并为所有 +/-2 天返回相对日期或格式化日期字符串

      <?php
      
      /**
       * Relative time
       *
       * date Format http://php.net/manual/en/function.date.php
       * strftime Format http://php.net/manual/en/function.strftime.php
       * latter can be used with setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
       *
       * @param  timestamp $target
       * @param  timestamp $base   start time, defaults to time()
       * @param  string $format use date('Y') or strftime('%Y') format string
       * @return string
       */
      function relative_time($target, $base = NULL, $format = 'Y-m-d H:i:s')
      {
      
          if(is_null($base)) {
              $base = time();
          }
      
          $baseDate = new DateTime();
          $targetDate = new DateTime();
      
          $baseDate->setTimestamp($base);
          $targetDate->setTimestamp($target);
      
          // don't modify original dates
          $baseDateTemp = clone $baseDate;
          $targetDateTemp = clone $targetDate;
      
          // normalize times -> reset to midnight that day
          $baseDateTemp = $baseDateTemp->modify('midnight');
          $targetDateTemp = $targetDateTemp->modify('midnight');
      
          $interval = (int) $baseDateTemp->diff($targetDateTemp)->format('%R%a');
      
          d($baseDate->format($format));
      
          switch($interval) {
              case 0:
                  return (string) 'today';
              break;
      
              case -1:
                  return (string) 'yesterday';
              break;
      
              case 1:
                  return (string) 'tomorrow';
              break;
      
              default:
                  if(strpos($format,'%') !== false )
                  {
                      return (string) strftime($format,  $targetDate->getTimestamp());
                  }
                  return (string) $targetDate->format($format);
              break;
      
          }
      }
      
      setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
      echo relative_time($weather->time, null, '%A, %#d. %B'); // Montag, 6. August 
      echo relative_time($weather->time, null, 'l, j. F'); // Monday, 6. August
      

      【讨论】:

        【解决方案9】:

        这对我有用,我想仅当日期是今天和前一天时才显示关键字“今天”或“昨天”,否则以 d-M-Y 格式显示日期

        <?php
        function findDayDiff($date){
           $param_date=date('d-m-Y',strtotime($date);
           $response  = $param_date;
           if($param_date==date('d-m-Y',strtotime("now"))){
               $response = 'Today';
           }else if($param_date==date('d-m-Y',strtotime("-1 days"))){
               $response = 'Yesterday'; 
           }
           return $response;
        }
        ?>
        

        【讨论】:

          【解决方案10】:
          function get_when($date) {
          
              $current = strtotime(date('Y-m-d H:i'));
          
              $date_diff = $date - $current;
              $difference = round($date_diff/(60*60*24));
          
              if($difference >= 0) {
                      return 'Today';
              } else if($difference == -1) {
                      return 'Yesterday';
              } else if($difference == -2 || $difference == -3  || $difference == -4 || $difference == -5) {
                      return date('l', $date);
              } else {
                      return ('on ' . date('jS/m/y', $date));
              }
          
          }
          
          get_when(date('Y-m-d H:i', strtotime($your_targeted_date)));
          

          【讨论】:

          • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
          猜你喜欢
          • 1970-01-01
          • 2021-11-28
          • 2017-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-03
          • 1970-01-01
          • 2023-01-30
          相关资源
          最近更新 更多