php中的日期时间构造函数

php中的日期时间构造函数,php,datetime,timezone,Php,Datetime,Timezone,我在php类上做了一个小实验。在文档中,他们给出了创建DateTime类对象的语法 面向对象的样式: public DateTime::__construct() ( [ string $time = "now" [, DateTimeZone $timezone = NULL ]] ) 程序风格: DateTime date_create ( [ string $time = "now" [, DateTimeZone $timezone = NULL ]] ) 返回新的DateTime对

我在php类上做了一个小实验。在文档中,他们给出了创建DateTime类对象的语法

面向对象的样式:

public DateTime::__construct() ( [ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
程序风格:

DateTime date_create ( [ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
返回新的DateTime对象

这里是他们指定为必填的第一个参数,如第节中指定的日期/时间字符串。或者,在使用$timezone参数时,我们必须在此处传递
NULL
,以获取当前时间

但我的问题是,当我给出以下代码时:

date_default_timezone_set('America/Los_Angeles');
$d_ob = new DateTime('x');
echo $d_ob->format('Y-m-d');
它应该会生成异常,但它会像-

2013-09-29

我不明白它是如何工作的?

显然,这不是一个bug,它是“预期的,但未记录的行为”。所有单个字母(j除外)代表军事时区

还有更多的信息

军事标准对每个区域使用单个字符。“Z”是世界时。“A”表示提前一小时,“M”表示提前12小时;“N”表示一小时后,“Y”表示12小时后。不使用字母“J”

所以我来回答你的问题

我不明白这是怎么回事

当向DateTime::_construct()传递一个不是有效时间字符串的值时,它会假定省略了第一个参数,并尝试将该字符串解析为时区。正如RFC所解释的,“x”是一个有效的时区,因此您将得到一个位于时区“x”中的DateTime实例

我应该提到,尽管\DateTime的构造函数识别这些单字母区域,但\DateTimeZone的构造函数


我希望这会有所帮助。

您使用的是哪个版本的PHP?第一个参数不是必需的,两个参数都是可选的。仅供参考。X代表X射线时区(UTC-1100),士兵
newdatetime('zzz')
或new
DateTime('zzz')
也会给出今天的日期。这种行为似乎适用于重复字符(不区分大小写)。