getTimestamp没有给出正确的小时

时间:2016-04-21 14:08:32

标签: php unix-timestamp

我有这个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,这意味着 GMT:Fri, 22 Apr 2016 20:16:00 GMT

小时数为20:16:00 - 这很奇怪,因为我已经将时间设置为00:00:00来自

  $from_date->setTime(0,0,0);

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

2 个答案:

答案 0 :(得分:3)

您作为DateTime::__construct()的第一个参数提供的日期不使用PHP理解的任何标准date and time formats。因此,它会尝试识别您提供的字符串中的日期和时间组件。

创建后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()返回的字符串没有任何操作,所以整行都是no-op

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

现在很清楚为什么$from_date->getTimestamp()会返回时间20:16 GMT:当时区00:00的偏移量为-20:16时,格林威治标准时间时区已经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 Epoch。这样生成的日期已经有时间00:00:00,无需进行设置。

它的输出是:

1461283200

答案 1 :(得分:-1)

您可以使用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();