我目前正在使用时区为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')
。
这是一个错误还是我误解了什么?
提前致谢
答案 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时间戳。任何比这更模糊的东西,无论如何都会有不确定的结果。