php strtotime奇怪的行为

时间:2014-07-08 12:29:34

标签: php timezone strtotime

我目前正在使用时区为php应用程序。

我发现strtotime似乎没有连贯的行为。 这个例子突出了我所说的:

var_dump("strtotime('now'), UTC, Europe/Paris and America/New_York");
date_default_timezone_set('UTC');
var_dump(strtotime('now'));
date_default_timezone_set('Europe/Paris');
var_dump(strtotime('now'));
date_default_timezone_set('America/New_York');
var_dump(strtotime('now'));

var_dump("strtotime('now UTC'), UTC, Europe/Paris and America/New_York");
date_default_timezone_set('UTC');
var_dump(strtotime('now UTC'));
date_default_timezone_set('Europe/Paris');
var_dump(strtotime('now UTC'));
date_default_timezone_set('America/New_York');
var_dump(strtotime('now UTC'));

var_dump("strtotime('today'), UTC, Europe/Paris and America/New_York");
date_default_timezone_set('UTC');
var_dump(strtotime('today'));
date_default_timezone_set('Europe/Paris');
var_dump(strtotime('today'));
date_default_timezone_set('America/New_York');
var_dump(strtotime('today'));

var_dump("strtotime('today UTC'), UTC, Europe/Paris and America/New_York");
date_default_timezone_set('UTC');
var_dump(strtotime('today UTC'));
date_default_timezone_set('Europe/Paris');
var_dump(strtotime('today UTC'));
date_default_timezone_set('America/New_York');
var_dump(strtotime('today UTC'));

结果:

string 'strtotime('now'), UTC, Europe/Paris and America/New_York'
int 1404821878
int 1404821878
int 1404821878
string 'strtotime('now UTC'), UTC, Europe/Paris and America/New_York'
int 1404821878
int 1404829078
int 1404807478
string 'strtotime('today'), UTC, Europe/Paris and America/New_York'
int 1404777600
int 1404770400
int 1404792000
string 'strtotime('today UTC'), UTC, Europe/Paris and America/New_York'
int 1404777600
int 1404777600
int 1404777600

strtotime('foo UTC')应该始终返回UTC时间戳,无论date_default_timezone_get()返回什么。

适用于strotime('today UTC'),此示例中的返回始终为1404777600。 此外,strtotime('today')按预期返回不同的时间戳,具体取决于设置的时区。

但是在调用strtotime('now UTC')时它会有相反的行为,它会返回时区设置的不同时间戳函数,并在调用1404821878时始终返回strtotime('now')

这是一个错误还是我误解了什么?

提前致谢

1 个答案:

答案 0 :(得分:2)

strtotime('now UTC')获取您时区的当前时间,将其解释为当地时间UTC并返回结果。即:

strtotime('now UTC') → strtotime('2014-07-08 14:35:00 UTC') → result

如果你遗漏了" UTC"这种转换不会发生。因为"现在"现在"现在",世界上任何地方。

顺便说一句:我从不依赖strtotime更为深奥的自动化时间数学,因为它通常甚至没有明确定义。 strtotime返回一个精确到秒的时间戳。在这种情况下,"今天"是什么意思?什么"现在UTC"是什么意思?什么" +1个月"是什么意思? strtotime非常适合将完整时间戳字符串(如2014-07-08 14:35:00 Europe/Berlin)转换为UNIX时间戳。任何比这更模糊的东西,无论如何都会有不确定的结果。