【问题标题】:PHP Timestamp into DateTimePHP时间戳到DateTime
【发布时间】:2012-08-15 20:04:14
【问题描述】:

您知道如何将其转换为 strtotime 或类似类型的值以传递给 DateTime 对象吗?

我的日期:

Mon, 12 Dec 2011 21:17:52 +0000

我尝试过的:

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

以上说法不正确。如果我遍历很多不同的日期,它都是相同的日期。

【问题讨论】:

    标签: php date datetime date-format time-format


    【解决方案1】:

    这是我的解决方案:

        function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
        {
            $date = new DateTime($date, new DateTimeZone($from));
            $date->setTimeZone(new DateTimeZone($to));
            return $date->format($targetFormat);
        }
    

    【讨论】:

      【解决方案2】:

      虽然@drrcknlsn 断言有多种方法可以将时间字符串转换为数据时间是正确的,但重要的是要认识到这些不同的方法不会以相同的方式处理时区。


      选项 1:DateTime('@' . $timestamp)

      考虑以下代码:

      date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
      

      strtotime 位消除了时区信息,date_create 函数假定为 GMT (Europe/Brussels)。

      因此,无论我在哪个服务器上运行,输出都将如下:

      2011-12-12T13:17:52+00:00
      

      选项 2:date_create()->setTimestamp($timestamp)

      考虑以下代码:

      date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
      

      您可能希望这会产生相同的输出。但是,如果我从比利时服务器执行此代码,我会得到以下输出:

      2011-12-12T14:17:52+01:00
      

      date_create 函数不同,setTimestamp 方法假定服务器的时区(在我的例子中为 'Europe/Brussels')而不是 GMT。


      明确设置您的时区

      如果您想确保输出与输入的时区匹配,最好明确设置。

      考虑以下代码:

      date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
      

      现在,还要考虑以下代码:

      date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
      

      因为我们明确设置输出的时区以匹配输入的时区,所以两者都会创建相同(正确)的输出:

      2011-12-12T21:17:52+08:00
      

      【讨论】:

        【解决方案3】:

        可能最简单的解决方案就是:

        DateTime::createFromFormat('U', $timeStamp);
        

        其中“U”表示 Unix 纪元。参见文档:http://php.net/manual/en/datetime.createfromformat.php

        【讨论】:

        • 此方法也忽略时区
        • @BoukeVersteegh 哪个没有?
        • @BoukeVersteegh 这是一个 Unix 时间戳!,它可以让您在创建对象时摆脱时区问题。只需在调用->format()之前使用->setTimezone 设置首选时区
        • @BoukeVersteegh 查看PHP manual 中的这个重要说明 "当$time 参数是UNIX 时间戳(例如@946684800)或指定时,$timezone 参数和当前时区将被忽略时区(例如 2010-01-28T15:00:00+02:00)。"
        • Unix 时间戳没有时区,根据定义它们始终是 UTC
        【解决方案4】:

        您不需要将字符串转换为时间戳来创建DateTime 对象(事实上,正如您所知,它的构造函数甚至不允许您这样做)。您可以简单地将日期字符串按原样输入DateTime 构造函数:

        // Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
        $dt = new DateTime($item->pubDate);
        

        话虽如此,如果您确实希望使用时间戳而不是字符串,则可以使用DateTime::setTimestamp()

        $timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
        $dt = new DateTime();
        $dt->setTimestamp($timestamp);
        

        编辑(2014-05-07):

        当时我实际上并没有意识到这一点,但DateTime 构造函数确实支持直接从时间戳创建实例。根据this documentation,您需要做的就是在时间戳前面加上@ 字符:

        $timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
        $dt = new DateTime('@' . $timestamp);
        

        【讨论】:

        • 这很好用。我以前试过这个,但一定没有给它足够的机会!!!谢谢:))
        • 请注意,new DateTime('@' . $timestamp)$dt = new DateTime(); $dt->setTimestamp($timestamp) 处理时区的方式不同。详情请见我的回答@stackoverflow.com/questions/12038558/…
        • 我认为new DateTime("@$timestamp") 可能更具可读性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2018-01-04
        • 1970-01-01
        • 2021-08-06
        • 2014-07-05
        相关资源
        最近更新 更多