【问题标题】:Convert Unix Timestamp to time from now in PHP在 PHP 中将 Unix 时间戳转换为从现在开始的时间
【发布时间】:2023-03-25 13:25:01
【问题描述】:

我有一个这样的时间戳:1362466800

我想把它输出成这样的:

Time left: 1 Year 2 Months 5 Days 17 hours 6 Minutes Left

如果还有不到 1 年或不到 1 个月等。字符串的那部分需要隐藏。

我知道在 5.3+ 中有一些内置的 PHP 函数,但它们似乎无法隐藏 0 的值。

感谢您的帮助。

【问题讨论】:

  • 你可以在 PHP 中使用 DateTime 类,然后使用 diff 来获取差异。就隐藏而言,检查每个是否为0,如果为0,则不显示。

标签: php date date-math


【解决方案1】:
$datetime1 = new DateTime();
$datetime2 = new DateTime('@1362466800');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %S seconds');
echo $elapsed;

See it in action

编辑

如果您想消除任何具有零值的句点,您可以使用下面的 sn-p 来删除它们。

$empties = array('0 years', '0 months', '0 days', '0 hours', '0 minutes', '0 seconds');
echo str_replace($empties, '', $elapsed);

参考

【讨论】:

  • 你如何让它隐藏在 0 的项目?在您的示例中,有 0 年、0 个月和 0 天,但它们仍在显示。
  • 那很好,我认为这也不能正确的单数和复数(例如,它说1 days 而不是1 day)而且最好只显示最外面的时间,因此,如果还剩 2 天 3 小时 45 秒,我希望字符串只说 2 天,如果还剩 3 小时 25 秒,我希望字符串只说 3 小时。这种格式有可能吗?
  • 我认为扩展此代码来做到这一点并不困难。我提供的代码是最难的部分。
【解决方案2】:

你可以这样做:

   echo secondsToTime(1362466800);

   function secondsToTime($seconds) {
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    return $dtF->diff($dtT)->format('%a days, %h hours, %i minutes and %s seconds');
}

【讨论】:

    【解决方案3】:

    根据@John Condes 的回答,我想出了一个函数,可以输出一个非常容易阅读的时间显示:

    function daysLeft($timestamp) {
        $datetime1 = new DateTime('@'.time() );
        $datetime2 = new DateTime('@' . $timestamp );
        $interval = $datetime1->diff($datetime2);
    
        $years = $interval->format('%y');
        $months = $interval->format('%m');
        $days = $interval->format('%a');
        $hours = $interval->format('%h');
        $minutes = $interval->format('%i');
        $seconds = $interval->format('%S');
    
        if($seconds):
            $elapsed = $seconds == 1 ? $seconds . ' Second ' : $seconds . ' Seconds ';
        endif;
        if($minutes):
            $elapsed = $minutes == 1 ? $minutes . ' Minute ' : $minutes . ' Minutes ';
        endif;
        if($hours):
            $elapsed = $hours == 1 ? $hours . ' Hour ' : $hours . ' Hours ';
        endif;
        if($days):
            $elapsed = $days == 1 ? $days . ' Day ' : $days . ' Days ';
        endif;
        if($months):
            $elapsed = $months == 1 ? $months . ' Month ' : $months . ' Months ';
        endif;
        if($years):
            $elapsed = $years == 1 ? $years . ' Year ' : $years . ' Years ';
        endif;
    
        return $elapsed;
    }
    

    如果有人试图做类似的事情。

    【讨论】:

      【解决方案4】:

      基于@Talon,我决定走得更远,写一个小班:

      /**
       * Calculates the time between two UNIX timestamps
       * Like 3 hours or 180 minutes.
       * 
       * @package Add Package Name Here
       * @version 1
       * @since Jul 12, 2013
       * @author Andrew Starlike <andrewstarlike@gmail.com>
       */
      class NiceDate
      {
      
      private $translation;
      
      /**
       * @param array $translation
       */
      public function __construct($translation = null)
      {
      $this->setTranslation($translation);
      }
      
      /**
       * Sets the translation of the time string
       * 
       * @param array $translation (the array must have this keys 'second', 'minute', 'hour', 'day', 'month', 'year')
       */
      private function setTranslation($translation = null)
      {
      if ($translation === null) {
          $translation = array();
          $plural = 's';
          $formats = array('second', 'minute', 'hour', 'day', 'month', 'year');
          foreach ($formats as $format) {
          $translation[$format] = ucfirst($format);
          $translation[$format . $plural] = ucfirst($format . $plural);
          }
      }
      
      $this->translation = $translation;
      }
      
      /**
       * 
       * @param int $old (UNIX timestamp)
       * @param int $newer (UNIX timestamp)
       * @return string
       */
      public function timeLeft($old, $newer)
      {
      $datetime1 = new DateTime('@' . $newer);
      $datetime2 = new DateTime('@' . $old);
      $interval = $datetime1->diff($datetime2);
      
      $years = $interval->format('%y');
      $months = $interval->format('%m');
      $days = $interval->format('%a');
      $hours = $interval->format('%h');
      $minutes = $interval->format('%i');
      $seconds = $interval->format('%S');
      
      $translation = $this->translation;
      
      if ($seconds):
          $elapsed = $seconds . ' ';
          $elapsed .= $seconds == 1 ? $translation['second'] : $translation['seconds'];
      endif;
      if ($minutes):
          $elapsed = $minutes . ' ';
          $elapsed .= $minutes == 1 ? $translation['minute'] : $translation['minutes'];
      endif;
      if ($hours):
          $elapsed = $hours . ' ';
          $elapsed .= $hours == 1 ? $translation['hour'] : $translation['hours'];
      endif;
      if ($days):
          $elapsed = $days . ' ';
          $elapsed .= $days == 1 ? $translation['day'] : $translation['days'];
      endif;
      if ($months):
          $elapsed = $months . ' ';
          $elapsed .= $months == 1 ? $translation['month'] : $translation['months'];
      endif;
      if ($years):
          $elapsed = $years . ' ';
          $elapsed .= $years == 1 ? $translation['year'] : $translation['years'];
      endif;
      
      return $elapsed;
      }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2011-01-29
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2020-07-29
        • 2010-10-25
        相关资源
        最近更新 更多