从unix时间戳创建php DateTime对象,在一行中设置时区

Posted

技术标签:

【中文标题】从unix时间戳创建php DateTime对象,在一行中设置时区【英文标题】:Create php DateTime object from unix timestamp, set timezone in one line 【发布时间】:2017-03-26 02:30:48 【问题描述】:

我知道在 php 中,您可以从 unix 时间戳创建 DateTime 对象,并将其时区设置为多行,如下所示:

$date = new DateTime('@' . $timestamp);
$date_with_timezone = $date->setTimezone(new DateTimeZone('America/Chicago'));

但是,我想在一行中执行此操作。以下方法不起作用:

$date_with_timezone = new DateTime('@' . $timestamp, new DateTimeZone('America/Chicago'));

有没有办法从 unix 时间戳创建一个 php DateTime 对象,并在同一行设置一个时区?

【问题讨论】:

【参考方案1】:

不是一行,而是两行……

<?php

$timestamp = time();
$TimeZone = 'Europe/Paris';
  
$Date_Obj = new DateTime(null, new DateTimeZone($TimeZone));
$Date_Obj->setTimestamp($timestamp);

echo $Date_Obj->format('Y-m-d H:i');
// get: 2021-12-09 02:36

date_default_timezone_set($TimeZone);
setlocale(LC_TIME,'fr_FR');

echo strftime('%A %e %B %Y - %H:%M', $Date_Obj->getTimestamp() );
// get: Thursday  9 December 2021 - 02:36 or in your lang 

?>

【讨论】:

【参考方案2】:

时区文档中有一条注释: 注意:

当 $time 参数是 UNIX 时间戳(例如 @946684800)或指定时区(例如 2010-01-28T15:00:00+02:00)时,$timezone 参数和当前时区将被忽略。

http://php.net/manual/en/datetime.construct.php

作为一种解决方法,您可以创建一个函数并传入时间戳和时区。然后,您可以实现将变量赋值保持在同一行的目标。在函数中,您可以使用时间戳创建 DateTime 对象,然后分配时区并返回它。

【讨论】:

【参考方案3】:

在 PHP 5.4 版中引入了实例化类成员访问(例如(new foo)-&gt;bar())支持(参见release notes),因此您可以这样做:-

$date = (new DateTime('@' . $timestamp))->setTimezone(new DateTimeZone('America/Chicago'));

See it working

【讨论】:

以上是关于从unix时间戳创建php DateTime对象,在一行中设置时区的主要内容,如果未能解决你的问题,请参考以下文章

PHP-MYSQL:将 Unix 时间戳转换为 DateTime,反之亦然

转换unix时间戳php

从 PHP < 5.3 中的时间戳创建 DateTime

当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)

将 datetime 转换为 Unix 时间戳并将其转换回 python

在 Python 中将 datetime 更改为 Unix 时间戳