• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DateTime::setTimestamp()

    date_timestamp_set

    (PHP 5 >= 5.3.0, PHP 7)

    以 Unix 时间戳的方式设置 DateTime 对象

    说明

    面向对象风格
    publicDateTime::setTimestamp(int $unixtimestamp): DateTime
    过程化风格
    date_timestamp_set(DateTime$object,int $unixtimestamp): DateTime

    以 Unix 时间戳的方式设置 DateTime 对象的日期和时间。

    参数

    $object

    仅过程化风格:由date_create()返回的DateTime类型的对象。此函数会修改这个对象。

    $unixtimestamp

    表示日期时间的 Unix 时间戳。

    返回值

    返回被修改的 DateTime 对象,或者在失败时返回FALSE.

    范例

    Example #1DateTime::setTimestamp()例程

    面向对象风格

    <?php
    $date = new DateTime();
    echo $date->format('U = Y-m-d H:i:s') . "\n";
    $date->setTimestamp(1171502725);
    echo $date->format('U = Y-m-d H:i:s') . "\n";
    ?>
    

    过程化风格

    <?php
    $date = date_create();
    echo date_format($date, 'U = Y-m-d H:i:s') . "\n";
    date_timestamp_set($date, 1171502725);
    echo date_format($date, 'U = Y-m-d H:i:s') . "\n";
    ?>
    

    以上例程的输出类似于:

    1272508903 = 2010-04-28 22:41:43
    1171502725 = 2007-02-14 20:25:25
    

    注释

    PHP 5.2 之后的版本中,可以使用 Unix 时间戳作为构造函数的参数生成新的DateTime对象,例如:

    PHP 5.2 之后的版本中,DateTime::setTimestamp()替代方案

    <?php
    $ts = 1171502725;
    $date = new DateTime("@$ts");
    echo $date->format('U = Y-m-d H:i:s') . "\n";
    ?>
    

    以上例程的输出类似于:

    1171502725 = 2007-02-14 20:25:25
    

    参见

    • DateTime::getTimestamp() Gets the Unix timestamp
    It should be noted above, be careful when manipulating the DateTime object with unix timestamps.
    In the above examples you will get varying results dependent on your current timezone, method used, and version of PHP.
    One would expect all of the examples above to perform the same as setTimestamp() or date('H:i', $timestamp); would.
    <?php
    date_default_timezone_set('America/New_York');
    $ts = 1171502725;
    ?>
    Set timestamp from UTC timezone use UTC timezone
    <?php
    $date = new DateTime("@$ts"); 
    var_dump($date->format('Y-m-d H:i:s e'));
    /*
    string(26) "2007-02-15 01:25:25 +00:00" //PHP 5.3.0 - 5.6.8
    */
    ?>
    To convert the above to use the current timezone simply use
    <?php
    $date->setTimezone(date_default_timezone_get());
    //string(36) "2007-02-14 20:25:25 America/New_York"
    ?>
    Set the timestamp from UTC timezone use current timezone
    <?php
    $date = new DateTime;
    $date->modify('@' . $ts); 
    var_dump($date->format('Y-m-d H:i:s e'));
    /*
    string(36) "2007-02-15 01:25:25 America/New_York" //PHP 5.3.6 - 5.6.8
    string(36) "2052-06-20 18:53:24 America/New_York" //PHP 5.3.0 - 5.3.5
    */
    ?>
    Set the timestamp from current timezone use current timezone
    <?php
    $date = new DateTime;
    $date->setTimestamp($ts); 
    var_dump($date->format('Y-m-d H:i:s e'));
    /*
    string(36) "2007-02-14 20:25:25 America/New_York" //PHP 5.3.0 - 5.6.8
    */
    ?>
    
    When you need to manipulate a unix timestamp like field (seconds since 1970-01-01) that may be greater than the drop dead date of 2038-01-19.
    <?php
    function secs2date($secs,$date)
      {
      if ($secs>2147472000)  //2038-01-19 expire dt
        {
        $date->setTimestamp(2147472000);
        $s=$secs-2147472000;
        $date->add(new DateInterval('PT'.$s.'S'));
        }
      else
        $date->setTimestamp($secs);
      }
    function date2secs($date,$datebeg)
      {
      $diff = $datebeg->diff($date);
      $secs=$diff->format('%a') * (60*60*24); //total days
      $secs+=$diff->format('%h') * (60*60);   //hours
      $secs+=$diff->format('%i') * 60;       //minutes
      $secs+=$diff->format('%s');           //seconds
      return $secs;
      }
    $datebeg = new DateTime('1970-01-01');
    $date=new dateTime();
    $secs=2017472000; //2033-12-06 08:53:20
    secs2date($secs,$date);
    $dt=$date->format('Y-m-d H:i:s');
    echo $dt."<br>";
    $sec2=date2secs($date,$datebeg);
    echo '(1) ',$sec2,'***',$secs,'<br>';
    $secs=2397472000; //2045-12-21 12:26:40
    secs2date($secs,$date);
    $dt=$date->format('Y-m-d H:i:s');
    echo $dt."<br>";
    $sec2=date2secs($date,$datebeg);
    echo '(2) ',$sec2,'***',$secs,'<br>';
    ?>
    
    When the exact time is important then it is important to note the difference between this and the UnixTimeStamp. The function will change the timestamp if necessary to take into account the daylight savings time.
    e.g. Working with the 'Europe/London' timezone and setting the DateTime object to a timestamp of 1288486753 will result in the function automatically altering it to 1288490353.
    This is because it is taking the fall time instead of the summer time (they will both be Sun, 31-Oct-2010 01:X:Y (I didn't check the hour and minute)).
    Sincerely,
    Aouie
    If your PHP version is lower than 5.3 then you can use this class to be able to use the functions "setTimestamp" and "getTimestamp":
    <?php
    class MyDateTime extends DateTime
    {
      public function setTimestamp( $timestamp )
      {
        $date = getdate( ( int ) $timestamp );
        $this->setDate( $date['year'] , $date['mon'] , $date['mday'] );
        $this->setTime( $date['hours'] , $date['minutes'] , $date['seconds'] );
      }
      
      public function getTimestamp()
      {
        return $this->format( 'U' );
      }
    }
    $date = new MyDateTime();
    $date->setTimestamp( $someTimestamp );
    echo $date->format( 'd/m/Y H:i:s' );
    ?>