我目前正在为一个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时间戳。