Ngày tháng (): Không an toàn khi dựa vào cài đặt múi giờ của hệ thống


359

Tôi đã gặp lỗi này khi tôi yêu cầu cập nhật phiên bản PHP từ 5.2.17 lên PHP 5.3.21 trên máy chủ.

<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<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>

</div>
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
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<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>

</div>

Câu trả lời:


556

Bạn có thể cần phải đặt múi giờ trong một dòng cấu hình trong php.initệp của mình . Bạn nên có một khối như thế này trong tệp php.ini của mình:

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

Nếu không, hãy thêm nó (thay thế múi giờ của bạn). Sau khi định cấu hình, đảm bảo khởi động lại httpd ( service httpd restart).

Dưới đây là danh sách các múi giờ được hỗ trợ .


12
để rõ ràng, sau khi thực hiện thay đổi này, hãy chắc chắn khởi động lại dịch vụ apache2
Ryan

2
Điều này giải quyết nó cho tôi khi các giải pháp khác không. Tôi chỉ nhận được lỗi này khi tôi sử dụng các hàm ngày trên cùng trang với tích hợp với Amazon SES. Có lẽ điều đó sẽ giúp người khác.
master_gracey

9
Nếu bạn đang sử dụng PHP CLI (php -r hoặc php -a) trong thiết bị đầu cuối máy khách của mình, bạn cần chỉnh sửa tệp php.ini CLI, không phải apache2. Tệp php.ini YourC CLI thường có thể được tìm thấy tại /etc/php5/cli/php.ini
justinpage

2
Giống như nhận xét đầu tiên về Apache, bạn cũng phải khởi động lại IIS để điều này có hiệu lực trên Windows / IIS.
qua

2
Điều này giải quyết vấn đề của tôi! Chỉ cần một thông tin cho những người không phải là chuyên gia như tôi, để tìm ra cách php.inisử dụng bởi apache, chỉ cần thực hiện lệnh sau php -i | grep php.ini.
Joël Salamin

198

Nếu bạn không thể sửa đổi cấu hình php.ini của mình, bạn cũng có thể sử dụng đoạn mã sau vào đầu mã của mình:

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

Danh sách các múi giờ có thể được tìm thấy tại http://www.php.net/manual/en/timezones.php .


7
Vì một số lý do, cài đặt date.timezone = America / New_York trong php.ini và khởi động lại apache không dừng thông báo lỗi này khi chạy tập lệnh bằng swiftmailer. Cuối cùng tôi cũng phải thêm date_default_timezone_set ('America / New_York'); ở đầu kịch bản như đề xuất. Cảm ơn!
kyle

Tôi đã thử giải pháp của bạn. Bây giờ, lỗi là 500 lỗi máy chủ nội bộ. Tôi đang sử dụng apache 2.x và codeigniter.
Hafiz Shehbaz Ali

@ShehbazAli Bạn chắc đã làm sai điều gì đó. Trong các tập lệnh của bạn đã thêm đoạn trích?
Babatunde Adeyemi

cùng một mã đang làm việc trên sản xuất. Không có lỗi. Tôi đã cài đặt apache, php và MySQL thủ công trên cửa sổ 10. Công việc PHP, MySQL và Apache. Nhưng, dự án này đang đưa ra lỗi.
Hafiz Shehbaz Ali

72

Thêm vào sau đây trong index.phptập tin của bạn . Lần đầu tiên tôi bắt gặp điều này khi tôi chuyển ứng dụng của mình từ máy chủ XAMPP sang Apache 2.2 và PHP 5.4 ...

Tôi sẽ khuyên bạn làm điều đó trong index.phptập tin của bạn thay vì php.initập tin.

if( ! ini_get('date.timezone') )
{
    date_default_timezone_set('GMT');
}

3
Giải pháp tuyệt vời khi bạn không nhất thiết phải có quyền truy cập hệ thống đầy đủ, hãy đoán đây là giải pháp dành cho những người có quyền truy cập hạn chế hoặc cần một giải pháp mạnh mẽ hơn và kết hợp điều này với chỉnh sửa php.ini nếu bạn có thể
aqm

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

thay vì

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

làm việc cho tôi (hiển thị năm hiện tại và không hiển thị thông báo lỗi nữa). (Cảm ơn Chris ở trên)


15

Nếu đây không phải là lựa chọn của bạn

  • Sửa đổi php.ini.
  • Thêm date_default_timezonecuộc gọi.

Thay vì datebạn có thể sử dụng gmdate.

Tôi đã sử dụng gmdate( "Y" )khi tôi cần một năm cho một snipplet bản quyền.


14

Nếu bạn đang sử dụng CodeIgniter và không thể thay đổi php.ini, tôi đã thêm phần sau vào đầu index.php:

date_default_timezone_set('GMT');

Nó làm việc cho tôi, cảm ơn sự giúp đỡ của Jose. Trân trọng, Sarim Ghani i-splendid.com
Sarim Shekhani

Điều này hoạt động trên php php.net/manual/en/feft.date-default-timezone-set.php . TY, bạn đưa tôi đi đúng hướng. Liên quan xem danh sách múi giờ cho hàm đây php.net/manual/en/timezones.php
Louis Loudog Trottier


11

@Justis chỉ cho tôi đi đúng hướng, nhưng mã của anh ta không hoạt động với tôi. Điều này đã làm:

// 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');
}

Tài liệu: http://www.php.net/manual/en/feft.date-default-timezone-get.php

Giải pháp này không chỉ dành cho những người không có quyền truy cập hệ thống đầy đủ. Nó là cần thiết cho bất kỳ kịch bản khi bạn cung cấp nó cho bất cứ ai khác ngoài bạn. Bạn không bao giờ biết máy chủ sẽ chạy tập lệnh nào khi bạn phân phối nó cho người khác.


5

Vấn đề này đã gây ra cho tôi một số thời gian vì tôi đang cố gắng đưa tập lệnh "createbucket.php" vào nhà soạn nhạc và tôi cứ nói rằng múi giờ của tôi không chính xác.

Cuối cùng, điều duy nhất khắc phục vấn đề là: $ sudo nano /etc/php.ini

Tìm kiếm múi giờ

[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

Đảm bảo bạn xóa ;

Rồi cuối cùng

$ sudo service httpd restart

Và bạn sẽ tốt để đi :)


5

Tôi đã phải đặt nó trong dấu ngoặc kép.

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

Vẫn không có công việc (trong Mac OSX), vì vậy cuối cùng tôi đã chia tay và thêm vào/etc/php.ini: date.timezone = America/Los_Angeles
MarkHu

3

Bạn có thể đặt múi giờ trong .htaccesstệp của mình

php_value date.timezone UTC

Điều này sẽ hoạt động trong trường hợp php.ini vẫn trả về cảnh báo mặc dù đã đặt (php 5.4. *). Đã làm cho tôi.
Christian Bonato

2

Ngoài việc đặt date.timezone = như đã đề cập trong một số câu trả lời, tôi đã tìm thấy một lỗi trong tệp php.ini khiến nó không thể truy cập date.timezone. Cách tôi tìm thấy nó là bằng cách chạy php từ dòng lệnh trong một thiết bị đầu cuối. điều này gây ra lỗi được báo cáo ở dòng 114. Trong trường hợp của tôi, tôi đã bỏ qua một cài đặt để hiển thị các lỗi có '|' giữa 2 giá trị. Nó không thích nó. Tôi đã xóa một trong các giá trị và | và mọi thứ đều tốt đẹp sau đó


1

Một phương pháp đơn giản cho hai múi giờ.

<?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 
?>


0

Một giải pháp nhanh chóng trong khi bạn khắc phục sự không tương thích, là tắt báo cáo lỗi trong index.phptệp của bạn :

Chèn dòng bên dưới vào index.php của bạn bên dướidefine( ‘_JEXEC’, 1 );

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

0

Tôi đang lưu trữ thùng EC2 và S3 của mình ở khu vực us-west-2 (Oregon). Khi tôi gọi $s3client->listBuckets()để liệt kê các nhóm hiện có trong php của mình, tôi đã nhận được ngoại lệ - "Uncaught exception 'Exception' with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings...". tôi đã thực hiện các thay đổi bên dưới để làm cho nó hoạt động. Chia sẻ những chi tiết này trong trường hợp ai đó đang đối mặt với vấn đề tương tự và bất kỳ câu trả lời nào ở trên đều không có ích.

  1. Dựa trên tài liệu @ AWS Định cấu hình Giao thức Thời gian Mạng (NTP) , tôi xác nhận trạng thái dịch vụ ntpd vẫn ổn bằng cách chạy ntpstatlệnh. Nếu bạn gặp lỗi, liên kết này giúp bạn biết điều gì đang xảy ra.
  2. Đã mở tệp /etc/php.ini (một số có thể có nó trong đường dẫn khác nhau dựa trên phiên bản php đã cài đặt) và thấy rằng nó date.timezonekhông được đặt thành bất kỳ giá trị nào và nó cũng được nhận xét theo mặc định. Tôi không bình luận bằng cách xóa ';' trước dòng này và đặt giá trị của nó thành "UTC"và lưu tệp.
  3. Đã khởi động lại http và ntp daemon bằng cách sử dụng sudo service httpd restartsudo service ntpd restartcác lệnh.

Sau này, tôi có thể liệt kê các thùng thành công mà không có ngoại lệ. Hi vọng điêu nay co ich.


0

Nếu bạn sử dụng Plesk, hãy thử nó, Đầu tiên, Mở Cài đặt PHP, ở cuối trang, thay đổi date.timezone từ DEFAULT sang UTC.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


0

Tôi gặp lỗi này khi chạy php-fpm trong nhà tù chroot. Tôi đã thử tạo etc / php.ini và / usr / share / zoneinfo trong thư mục chroot, nhưng nó không hoạt động. Tôi thậm chí đã thử strace-ing các trình tiện ích php-fpm để xem họ đang thiếu tập tin nào - không có gì nhảy ra.

Vì vậy, trong trường hợp Google đưa bạn đến đây vì bạn gặp lỗi này khi sử dụng php-fpm được định cấu hình cho chroot, bạn có thể khắc phục bằng cách thêm dòng này /etc/php-fpm.d/www.confvào phần ENV:

env[TZ] = America/New_York

Một khởi động lại php-fpm thường được yêu cầu để nó có hiệu lực. Hy vọng điều này sẽ giúp ai đó ngoài kia.


0

Trong trường hợp cụ thể của tôi, tôi đã cấu hình PHP để sử dụng PHP-FPM (Trình quản lý quy trình FastCGI). Khi thực hiện phpinfo()từ CLI, tôi đã thấy múi giờ chính xác mà tôi đã đặt trong php.ini, tuy nhiên nó vẫn không chính xác trong trình duyệt và khiến mã của tôi bị lỗi. Tôi chỉ cần khởi động lại php-fpmdịch vụ trên máy chủ.

service rh-php56-php-fpm restart

Bạn cũng có thể cần phải khởi động lại httpddịch vụ nếu bạn chỉnh sửaphp.ini

service httpd restart

0

Câu trả lời trên của CtrlX là câu trả lời đúng, nhưng nó có thể không hoạt động hoàn toàn. Tôi đã thêm dòng này vào tệp php.ini của mình :

date.timezone = "America/Los_Angeles"

nhưng nó không xóa lỗi PHP cho tất cả các tệp của tôi vì một số tập lệnh PHP của tôi nằm trong các thư mục con. Vì vậy, tôi đã phải chỉnh sửa tệp .htaccess để thiết lập php.ini để được sử dụng đệ quy (trong các thư mục con):

suphp_configpath /home/account_name/public_html

trong đó account_name là tên tài khoản cpanel của bạn và public_html là thư mục mà tệp php.ini của bạn nằm trong.


0

Đối với người dùng docker: Tạo tệp timezone.ini cục bộ trong dự án của bạn, hãy thiết lập cấu hình trong docker-compose.yml,

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

timezone.ini

    date.timezone=Australia/Sydney

0

Nếu bạn không có quyền truy cập vào tệp php.ini, hãy tạo hoặc chỉnh sửa .htaccesstệp trong thư mục gốc của tên miền hoặc phụ của bạn và thêm tệp này (được tạo bởi cpanel):

<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>

Vui lòng cố gắng không sử dụng các từ viết hoa trong trường hợp quy ước vỏ bình thường có thể diễn tả những gì bạn muốn nói.
shizhen

0

Có hai lựa chọn để giải quyết điều này

Đầu tiên, thay đổi tệp php.ini và đặt múi giờ mặc định

date.timezone = "America/New_York"

Khi bạn đã đặt múi giờ trong php.ini, hãy khởi động lại máy chủ

Thứ hai, Thay đổi múi giờ gán thời gian chạy dựa trên nhu cầu của bạn

date_default_timezone_set('America/New_York');

-1

Trong trang kết nối của bạn, đặt một mã như thế này date_default_timezone_set("Africa/Johannesburg");dựa trên vị trí hiện tại của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.