PHP 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')时却有相反的行为,它返回不同时区设置的时间戳函数,而在调用strtotime('now')时总是返回1404821878

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

Thanks in advance

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

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

如果省略"UTC"则不会发生此转换,因为"now"在世界上任何地方都是"now"。

作为题外话:我从来不会依赖strtotime更深奥的自动时间数学,因为它通常甚至没有很好地定义。strtotime返回精确到秒的时间戳。在这种情况下,"今天"究竟意味着什么?"现在UTC"到底是什么意思?"+1个月"到底是什么意思?strtotime非常适合将完整的时间戳字符串(如2014-07-08 14:35:00 Europe/Berlin)转换为UNIX时间戳。

相关内容

  • 没有找到相关文章