Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php getTimestamp没有给出正确的时间_Php_Unix Timestamp - Fatal编程技术网

Php getTimestamp没有给出正确的时间

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

我有以下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: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
  • 字符串的其余部分(
    -2016
    )用作时区偏移量;i、 e.
    -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
  • 字符串的其余部分(
    -2016
    )用作时区偏移量;i、 e.
    -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
(和计数)。这不是问题所问的。真正好的答案——应该是被接受的答案,而不是我的。我只是直截了当地说到点子上,而不是解释所有的事情。事实上,谢谢你花时间写了这么好的答案。真的很好的答案——应该是被接受的答案,而不是我的。我只是直截了当地说到点子上,而不是解释所有的事情。事实上,谢谢你花时间写了这么好的答案。