为什么PHP认为依赖系统的时区是个坏主意?

时间:2014-04-01 12:24:46

标签: php timezone

我对保持PHP的时区更新感到有些恼火。我真的很喜欢我系统上的其他任何东西都相信我能够正确地维护系统的时区。也许可能存在以不同方式配置PHP可能有用的用例,但为什么PHP警告我依赖我的时区是不安全的?

  

警告:date():依赖系统的时区设置是不安全的。您必需使用date.timezone设置或date_default_timezone_set()函数。

4 个答案:

答案 0 :(得分:8)

以下是PHP开发人员对此的评论(在related discussion中):

  

不 - 作为管理员,您需要做出明智的决定   你想要什么时区。有太多的bug   报告人们没有线索,所以现在我们发出警告。

Derick Rethans是this commit的作者,它将date_warning从E_STRICT(在PHP 5.2-中)转换为E_WARNING(PHP 5.3 +)。

同样的讨论对此有一个很好的(但显然很尴尬)解决方案,由MediaWiki应用:

  

实际上,合理的默认值是guess_timezone()已经存在的,   除了没有警告。你可以通过例如

来获得这种行为
date_default_timezone_set( @date_default_timezone_get() );
     

位于程序的顶部。这就是MediaWiki的作用(除了   修改error_reporting而不是使用@)。我们偷了这个主意   另一个网络应用。它比复制更方便   应用程序中guess_timezone()的功能。

     

这是Derick的特权,可以让所有用户半死不活   警告,表明他对操作系统状态的厌恶   支持查询系统时区。这是我们给予他的奖励   用于编写大量日期/时间代码。

此解决方法的关键部分是date_default_timezone_get函数,它按顺序返回默认时区...

  • 使用date_default_timezone_set()函数(如果有)
  • 读取时区集
  • 读取TZ环境变量(如果非空)(在PHP 5.3.0之前)
  • 读取date.timezone ini选项的值(如果已设置)
  • 查询主机操作系统(如果操作系统支持并允许)

答案 1 :(得分:8)

因为德里克这么说。这就是为什么。这个internals mailing list thread将告诉你关于这个决定背后的“逻辑”。 date.timezone警告对于任何使用PHP作为编程语言的人来说都是一个持续的烦恼,而不是替代知道如何编写代码。

更具体地说,此行为驱动 me 坚果。我通常不会滥用SO Q& A系统来发泄,但这个警告驱使我香蕉。此外,它是4月1日所以为什么不呢?

答案 2 :(得分:0)

1)使用系统时区是major performance overhead

2)不同供应商对TZ数据库的实施具有很多功能性问题

3)intellectual property数据周围存在问题。索赔的威胁和捍卫它们的费用破坏了这些项目 - 而不是索赔的有效性。 2011年案件在法庭外解决,意味着该案件仅在原告案件中得到解决,而不是针对未来的任何挑战。

4)(3)的结果是,即使系统管理员对更新感到不满,也可能存在阻止传播修订数据的上游问题

答案 3 :(得分:-2)

PHP经常被正确维护系统或在其他人群中运行的人使用。系统(共享主机)。如果您正确维护系统,则单独配置默认PHP时区很简单。