我有以下代码:
<?php
$date = new DateTime;
var_dump($date);
$date->timezone = 'Europe/Madrid';
var_dump($date->timezone); // Shows 'Europe/Madrid'
var_dump($date); // Shows 'UTC' (!)
var_dump($date->timezone); // Shows 'UTC' (!!)
显示以下输出:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2017-11-08 21:21:15.596968"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
string(13) "Europe/Madrid"
object(DateTime)#1 (3) {
["date"]=>
string(26) "2017-11-08 21:21:15.596968"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
string(3) "UTC"
当我做一个简单的$date->timezone
时,为什么var_dump($date)
从“欧洲/马德里”变回“UTC”?
使用print_r()
代替var_dump()
会产生相同的结果。
答案 0 :(得分:1)
timezone
不是新DateTime
类的属性。您可以在创建DateTime对象后立即尝试访问它来验证它。
$date = new DateTime;
echo $date->timezone;
这将为您提供未定义的财产通知。
PHP创建timezone
属性,以便在对象上执行print_r
或var_dump
时显示,但修改该属性不会修改基础数据。
下次对象var_dump
或print_r
时,将重新生成显示属性,覆盖您的更改。
如果您确实需要更改时区,则可以使用setTimezone
方法。
$date->setTimezone(new DateTimeZone('Europe/Madrid'));
(或者在PHP配置中设置时区。)
有趣的是,直接引用timezone
属性即使用setTimezone
更新后仍显示旧值。显然,您需要var_dump
整个对象才能重新创建这些属性。
$date = new DateTime;
var_dump($date); // Shows 'UTC'
$date->setTimezone(new DateTimeZone('Europe/Madrid'));
var_dump($date->timezone); // Still shows 'UTC' (!)
var_dump($date); // Shows 'Europe/Madrid'
var_dump($date->timezone); // Shows 'Europe/Madrid'