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
我有这个 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