【问题标题】:How to convert ISO 8601 timestamp without timezone to ISO 8601 timestamp with timezone in PHP?如何在 PHP 中将不带时区的 ISO 8601 时间戳转换为带时区的 ISO 8601 时间戳?
【发布时间】:2019-02-02 20:56:16
【问题描述】:

我的时间戳是这样的:

$timestamp = "2018-08-28T08:49:44+00:00";

很容易将其转换为 unix 时间戳:

$unixtime = strtotime($timestamp);
echo $unixtime; // result: 1535446184

我想要的结果是获取当前时区的时间戳。应该是这样的:

$timestamp_with_timezone = "2018-08-28T10:49:44+02:00";

但是如果我这样做:

echo date('c',$unixtime);

结果又是:

2018-08-28T08:49:44+00:00

以 ISO 8601 格式获取所需本地时间日期的正确方法是什么?

【问题讨论】:

  • 是的,但你“真正”想要什么? ;-) 服务器所在时区的时间,还是用户所在时区的时间?第一个要求您知道运行 PHP 网站的服务器的时区设置,第二个要求用户发送有关用户位置的信息(或者他们可能在数据库中有一个用户首选项表,其中他们存储自己喜欢的时区???)。
  • 没错,我应该进一步澄清这一点。但是,这是为了修改新闻文章的发布日期,因此我需要网站所在国家/地区的时区:在 WordPress 中,我可以使用 get_option('timezone_string')
  • 如果我需要服务器时间,我可以使用date_default_timezone_get(),如果我需要用户时间,这完全取决于我从哪里得到它,仅供感兴趣的人使用。

标签: php date unix-timestamp iso8601 gmt


【解决方案1】:

使用DateTime 类:

// DateTime automatically parses this format, no need for DateTime::createFromFormat()
$date = new DateTime("2018-08-28T08:49:44+00:00");

// Set the timezone (mine here)
$date->setTimezone(new DateTimeZone('Europe/Paris'));

// Output: 2018-08-28T10:49:44+02:00
echo $date->format('c');

【讨论】:

  • @Blackbam 感谢您的编辑!我第一次在一行上写了这个,粘贴和拆分代码时忘记删除回声。
【解决方案2】:

可以设置 DateTime 对象的 TimeZone:

$timestamp = "2018-08-28T08:49:44+00:00";

$date = date_create($timestamp);

$date->setTimezone(new DateTimeZone('Europe/Amsterdam'));

echo date_format($date, 'Y-m-d H:i:sP') . "\n";

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 2023-04-11
    • 2013-03-11
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2013-12-06
    • 2011-05-02
    相关资源
    最近更新 更多