6

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

面向对象风格:

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

程序风格:

DateTime date_create ( [ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

返回新的 DateTime 对象。

这里他们指定为强制的第一个参数,作为日期和时间格式部分中指定的日期/时间字符串。或者我们NULL在使用 $timezone 参数时必须通过这里来获取当前时间。

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

date_default_timezone_set('America/Los_Angeles');
$d_ob = new DateTime('x');
echo $d_ob->format('Y-m-d');

它应该会产生异常,但它会呼应当前日期时间,例如-

2013-09-29

我不明白这一点,它是如何工作的?

4

1 回答 1

5

显然,这不是一个错误,它是“预期的,但未记录的行为”请参阅错误报告的评论。所有单个字母(“j”除外)都代表军事时区,请参阅一些代码来证明这一点

这里有更多信息。

来自RFC822

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

所以回答你的问题

我不明白这一点,它是如何工作的?

当 DateTime::__construct() 传递一个不是有效时间字符串的单个值时,它假定第一个参数已被省略并尝试将字符串解析为时区。正如 RFC 解释的那样,“x”是一个有效的时区,因此您将获得一个位于时区“X”中的 DateTime 实例。

我应该提一下,虽然 \DateTime 的构造函数可以识别这些单字母区域,但 \DateTimeZone 的构造函数却不能!

我希望这会有所帮助。

于 2013-09-29T15:23:40.050 回答