getTimestamp 没有给出正确的时间

getTimestamp is not giving the correct hour

我有这个 PHP 代码:

$from_date = new DateTime('April-22-2016');
$from_date->format( 'Y-m-d 00:00:00' );
$from_date->setTime(0,0,0);
print ' / '. $from_date_unix = $from_date->getTimestamp();

上面的代码打印了一个Unix时间戳1461356160,这意味着 格林威治标准时间:Fri, 22 Apr 2016 20:16:00 GMT

时间是 20:16:00 - 这很奇怪,因为我已经通过

将时间设置为 00:00:00
  $from_date->setTime(0,0,0);

我的代码有错吗?我需要检查 php.ini 中的内容吗?

您可以使用 DateTime::createFromFormat

以正确的格式解析 DateTime 对象

这样使用:

$from_date = DateTime::createFromFormat('!F-d-Y', 'April-22-2016');
$from_date->format( 'Y-m-d 00:00:00' );
print ' / '. $from_date_unix = $from_date->getTimestamp();

您作为 DateTime::__construct() does not use any of the standard date and time formats 的第一个参数提供的日期被 PHP 理解。因此,它会尝试识别您提供的字符串中的日期和时间部分。

创建后的 print_r($from_date) 会立即显示 PHP(错误)从您的约会中理解的内容:

DateTime Object
(
    [date] => 2016-04-22 00:00:00.000000
    [timezone_type] => 1
    [timezone] => -20:16
)

首先,当它开始为日期和时间解析字符串时,PHP 使用当前日期、时间和时区初始化新的 DateTime 对象。然后它会覆盖它在您的字符串中标识的组件,如下所示:

  • April 被正确识别为月份名称;
  • 22 是一个月中的第几天;
  • 出于某种我现在不知道的原因,它将新对象的时间设置为 00:00:00;
  • 字符串的其余部分 (-2016) 被用作时区偏移;即 -20:16 小时。

也许它的工作方式对您来说听起来很愚蠢,但由于您为它提供了一个随机字符串,所以这是它能从中得到的最好结果。

代码的下一行 ($from_date->format( 'Y-m-d 00:00:00' );) 生成一个字符串并且不修改 DateTime 对象。因为您没有对 DateTime::format(), the entire line is a no-op.

返回的字符串执行任何操作

下一行 ($from_date->setTime(0,0,0);) 对 $from_date 也没有任何影响,因为时间已经是 00:00:00.

现在很清楚为什么 $from_date->getTimestamp() returns 时间 20:16 GMT:当它在 00:00 时区偏移 -20:16,在 GMT 时区已经是 20:16.


为了得到你想要的,你需要使用DateTime::createFromFormat()静态函数:

$from_date = DateTime::createFromFormat(
    '!F-d-Y',
    'April-22-2016',
    new DateTimeZone('GMT')
);
print ' / '. $from_date_unix = $from_date->getTimestamp();

注意格式说明符开头的感叹号 (!)。它告诉 PHP 将所有日期和时间组件重置为 Unix 纪元。这样生成的日期已经有了时间00:00:00,就不用再设置了。

它的输出是:

1461283200