为何PHP的DATE_RFC7231格式会忽略时区设置?
问题解答
这是故意设计的行为,完全符合RFC7231的规范要求,既不是PHP的BUG,也不是你对格式的误解。
核心原因:
RFC7231是HTTP协议的标准规范,其中明确规定:HTTP报文里的日期相关头部(比如Date、Last-Modified)必须使用GMT(UTC)时区,格式固定为Day, DD Mon YYYY HH:MM:SS GMT,不允许使用其他时区偏移或时区标识。
PHP提供的DATE_RFC7231常量,就是专门用来生成符合HTTP标准的日期字符串。因此不管你的DateTime对象本身设置的是什么时区,使用这个格式格式化时:
- 会自动将时间转换为GMT(UTC)时区
- 强制在末尾显示
GMT标识
对你的代码示例的补充说明:
你的示例输出存在矛盾——原DateTime对象是+08:00时区的2023-02-15T06:44:41,对应的GMT时间应该是2023-02-14T22:44:41,而非示例中写的06:44:41 GMT。这大概率是示例书写时的笔误,实际运行DATE_RFC7231格式化会输出正确的GMT时间。
额外提示:
如果需要生成类似RFC7231风格但保留原时区偏移的字符串,不要用DATE_RFC7231,可以自定义格式字符串,比如:
echo DateTime::createFromFormat(DATE_ATOM, '2023-02-15T06:44:41+08:00')->format('D, d M Y H:i:s O'); // 输出:Wed, 15 Feb 2023 06:44:41 +0800
内容的提问来源于stack exchange,提问作者JSowa
相关产品推荐
相关产品推荐

