Php getTimestamp没有给出正确的时间
我有以下PHP代码:Php getTimestamp没有给出正确的时间,php,unix-timestamp,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,这意味着 格林尼治标准时间:2016年4月22日星期五20:1
$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
,这意味着
格林尼治标准时间:2016年4月22日星期五20:16:00格林尼治标准时间
时间是20:16:00
——这很奇怪,因为我已经通过via将时间设置为00:00:00
$from_date->setTime(0,0,0);
我的代码错了吗?是否需要在
php.ini
中检查某些内容?您可以使用
像这样使用它:
$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();
您可以使用 像这样使用它:
$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();
作为第一个参数提供给的日期不使用PHP理解的任何标准。因此,它尝试在您提供的字符串中标识日期和时间组件 创建后立即打印($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
- 字符串的其余部分(
)用作时区偏移量;i、 e.-2016
小时-20:16
$from_date->format('Y-m-d 00:00:00');
)生成一个字符串,并且不修改DateTime
对象。因为您没有对返回的字符串执行任何操作,所以整行都是一个字符串
下一行($from\u date->setTime(0,0,0);
)对$from\u date
也没有任何影响,因为它的时间已经是00:00:00
现在很清楚为什么$from_date->getTimestamp()
返回时间20:16 GMT
:当偏移量-20:16
的时区00:00
时,GMT时区上已经有20:16
为了得到您想要的,您需要使用静态函数:
$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),显示PHP(错误)对日期的理解:
DateTime Object
(
[date] => 2016-04-22 00:00:00.000000
[timezone_type] => 1
[timezone] => -20:16
)
首先,当PHP开始解析日期和时间的字符串时,它用当前日期、时间和时区初始化新的DateTime
对象。然后,它将覆盖它在字符串中标识的组件,如下所示:
被正确识别为月份名称李>April
是一个月中的一天李>22
- 由于某种原因,我现在不知道,它将新对象的时间设置为
李>00:00:00
- 字符串的其余部分(
)用作时区偏移量;i、 e.-2016
小时-20:16
$from_date->format('Y-m-d 00:00:00');
)生成一个字符串,并且不修改DateTime
对象。因为您没有对返回的字符串执行任何操作,所以整行都是一个字符串
下一行($from\u date->setTime(0,0,0);
)对$from\u date
也没有任何影响,因为它的时间已经是00:00:00
现在很清楚为什么$from_date->getTimestamp()
返回时间20:16 GMT
:当偏移量-20:16
的时区00:00
时,GMT时区上已经有20:16
为了得到您想要的,您需要使用静态函数:
$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
难道
M
不必是F
?@axiac I刚刚将更改合并到OP的代码中。您的代码输出1461336808
(和计数)。这不是问题所要问的。难道M
不必是F
?@axiac I刚刚将更改合并到OP的代码中。您的代码输出1461336808
(和计数)。这不是问题所问的。真正好的答案——应该是被接受的答案,而不是我的。我只是直截了当地说到点子上,而不是解释所有的事情。事实上,谢谢你花时间写了这么好的答案。真的很好的答案——应该是被接受的答案,而不是我的。我只是直截了当地说到点子上,而不是解释所有的事情。事实上,谢谢你花时间写了这么好的答案。