关于php:“date():依靠系统的时区设置是不安全的……”

“date(): It is not safe to rely on the system's timezone settings…”

当我请求在服务器上将PHP版本从5.2.17更新到PHP 5.3.21时,我收到此错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<h4>A PHP Error was encountered</h4>

<p>
Severity: Warning
</p>
<p>
Message:  date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/New_York' for 'EDT/-4.0/DST' instead
</p>
<p>
Filename: libraries/Log.php
</p>
<p>
Line Number: 86
</p>


Warning: date(): It is not safe to rely on the system'
s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/New_York' for 'EDT/-4.0/DST' instead in /filelocation right here/system/libraries/Log.php on line 86

Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/New_York' for 'EDT/-4.0/DST' instead in /filelocation right here/system/libraries/Log.php on line 99


<h4>A PHP Error was encountered</h4>

<p>
Severity: Warning
</p>
<p>
Message:  date(): It is not safe to rely on the system'
s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/New_York' for 'EDT/-4.0/DST' instead
</p>
<p>
Filename: libraries/Log.php
</p>
<p>
Line Number: 99
</p>

您可能需要将时区放在php.ini文件的配置行中。你应该在php.ini文件中有一个这样的块:

1
2
3
4
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = America/New_York

如果没有,请添加它(由您的时区替换)。配置完成后,请确保重新启动httpd(service httpd restart)。

以下是支持的时区列表。


如果您无法修改php.ini配置,您也可以在代码的开头使用以下代码段:

1
date_default_timezone_set('Africa/Lagos');//or change to whatever timezone you want

时区列表可在http://www.php.net/manual/en/timezones.php找到。


index.php文件中添加以下内容。当我将我的应用程序从XAMPP服务器移动到Apache 2.2和PHP 5.4时,我第一次遇到这个问题...

我建议你在index.php文件而不是php.ini文件中执行此操作。

1
2
3
4
if( ! ini_get('date.timezone') )
{
    date_default_timezone_set('GMT');
}


1
<? print(gmdate("Y")); ?>

代替

1
<? print(date("Y")); ?>

为我工作(显示当前年份,不再显示错误消息)。
(感谢克里斯上面)


如果这些不是您的选择

  • 修改php.ini
  • 添加date_default_timezone电话。

而不是date,您可以使用gmdate

当我需要一年的版权信息时,我使用了gmdate("Y" )


如果您正在使用CodeIgniter并且无法更改php.ini,我将以下内容添加到index.php的开头:


我始终将此行保留在codeigniter的root index.php中。因此我的代码可以在任何服务器上运行

此处支持的时区列表


@Justis向我指出了正确的方向,但他的代码对我不起作用。这样做:

1
2
3
4
5
// set the default timezone if not set at php.ini
if (!date_default_timezone_get('date.timezone')) {
    // insert here the default timezone
    date_default_timezone_set('America/New_York');
}

文档:http://www.php.net/manual/en/function.date-default-timezone-get.php

此解决方案不仅适用于没有完整系统访问权限的用户。除了您之外,任何脚本都必须提供给任何其他人。当您将脚本分发给其他人时,您永远不知道脚本将在什么服务器上运行。


我不得不用双引号。

1
date_default_timezone_set("America/Los_Angeles"); // default time zone


这个问题一直困扰着我,因为我试图将"createbucket.php"脚本注入作曲家,并且我一直被告知我的时区不正确。

最后解决问题的唯一方法是:
$ sudo nano /etc/php.ini

搜索时区

1
2
3
4
[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = UTC

确保删除;

然后最后

1
$ sudo service httpd restart

你会很高兴去:)


除了在几个答案中提到的date.timezone =之外,
我在php.ini文件中发现了一个错误,导致它无法访问date.timezone。
我发现它的方式是从终端的命令行运行php。
这导致在第114行报告错误。在我的情况下,我已取消注释显示错误的设置'|'两个值之间。它不喜欢它。
我删除了其中一个值和|之后一切都很好


您可以在.htaccess文件中设置时区

1
php_value date.timezone UTC

1
<? date_default_timezone_set('Europe/Istanbul'); ?>

对于PHP(或您的位置)。


两个时区的简单方法。

1
2
3
4
5
6
7
8
9
<?php
$date = new DateTime("2012-07-05 16:43:21", new DateTimeZone('Europe/Paris'));

date_default_timezone_set('America/New_York');

echo date("Y-m-d h:iA", $date->format('U'));

// 2012-07-05 10:43AM
?>


如果您无权访问文件php.ini,请在域或子域的根目录中创建或编辑.htaccess文件并添加(由cpanel生成):

1
2
3
4
5
6
7
8
9
10
11
<IfModule mime_module>
AddType application/x-httpd-ea-php56 .php .php5 .phtml
</IfModule>

<IfModule php5_module>
php_value date.timezone"America/New_York"
</IfModule>

<IfModule lsapi_module>
php_value date.timezone"America/New_York"
</IfModule>


我在us-west-2(俄勒冈州)地区托管我的EC2和S3桶。当我调用$s3client->listBuckets()列出我的php中的现有存储桶时,我得到了异常 - "Uncaught exception 'Exception' with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings...".
我做了以下更改以使其工作。分享这些细节,以防有人面临类似的问题,上述任何答案都没有帮助。

  • 根据文档@ AWS配置网络时间协议(NTP),我通过运行ntpstat命令确认ntpd服务状态正常。如果您收到错误,此链接可帮助您了解出现了什么问题。
  • 打开/etc/php.ini文件(有些可能根据安装的php版本在不同的路径中),发现date.timezone没有设置为任何值,默认情况下也被注释。我通过删除';'取消评论在此行之前,将其值设置为"UTC"并保存文件。
  • 使用sudo service httpd restartsudo service ntpd restart命令重新启动http和ntp守护程序。
  • 在此之后,我能够成功列出存储桶,没有任何异常。希望这可以帮助。


    如果您使用Plesk,请尝试它,首先,打开PHP设置,在页面底部,将date.timezone从DEFAULT更改为UTC。

    enter image description here

    enter image description here


    我在chroot监狱中运行php-fpm时遇到此错误。我尝试在chroot目录中创建etc / php.ini和/ usr / share / zoneinfo,但它只是不起作用。我甚至尝试过扫描php-fpm守护进程来查看他们丢失的文件 - 没有任何内容跳出来。

    因此,如果Google将您带到这里,因为您在使用为chroot配置的php-fpm时遇到此错误,您可以通过将此行添加到ENV部分中的/etc/php-fpm.d/www.conf来修复它:

    1
    env[TZ] = America/New_York

    通常需要php-fpm restart才能生效。希望这有助于那里的人。


    在纠正不兼容性的同时,快速解决方案是禁用index.php文件中的错误报告:

    将下面的行插入define( ‘_JEXEC’, 1 );下面的index.php中

    1
    2
    error_reporting( E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR |
    E_COMPILE_WARNING );


    在我的特定情况下,我将PHP配置为使用PHP-FPM(FastCGI Process Manager)。从CLI执行phpinfo()时,我看到了我在php.ini中设置的正确时区,但是在浏览器中它仍然不正确并导致我的代码失败。我只需要重新启动服务器上的php-fpm服务。

    1
    service rh-php56-php-fpm restart

    如果您编辑了php.ini,则可能还需要重新启动httpd服务

    1
    service httpd restart

    从CtrlX上面得到的答案是正确的答案,但它可能无法完全发挥作用。
    我在php.ini文件中添加了这一行:

    1
    date.timezone ="America/Los_Angeles"

    但它并没有删除所有文件的PHP错误,因为我的一些PHP脚本都在子文件夹中。所以我必须编辑.htaccess文件来设置php.ini以递归方式使用(在子文件夹中):

    1
    suphp_configpath /home/account_name/public_html

    其中account_name是您的cpanel帐户名,public_html是您的php.ini文件所在的文件夹。


    对于docker用户:
    在项目中创建一个本地timezone.ini文件,在docker-compose.yml中设置配置,

    1
    2
        volumes:
            -"./docker/config/timezone.ini:/usr/local/etc/php/conf.d/timezone.ini"

    timezone.ini

    1
        date.timezone=Australia/Sydney

    这是一个简单的解决方案,谁不知道时区。