Cách sửa lỗi PHP Warning: date() It is not safe to rely on the system's timezone settings

beginner🐘 PHP2026-05-29| PHP 5.3 đến PHP 8.3+ chạy trên Linux (Ubuntu, CentOS, Debian), macOS, hoặc Windows (XAMPP, WAMP, Docker).

Error Message

PHP Warning: date(): It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function.
#php#timezone#múi giờ#devops#php.ini#gỡ lỗi

Vấn đề nhức nhối trên Production lúc 2 giờ sángTệp nhật ký của bạn đang "gào thét". Thay vì dữ liệu sạch sẽ, bạn thấy một làn sóng cảnh báo lặp đi lặp lại. Đây là một vấn đề production kinh điển: một cấu hình sai sót duy nhất đang làm đầy tệp nhật ký lỗi của bạn thêm 500MB và che lấp các lỗi thực sự dưới một núi nhiễu. PHP đang phàn nàn vì nó không thể tìm thấy múi giờ đáng tin cậy cho hàm date() của mình.

PHP Warning: date(): It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function.

Đây không phải là một lỗi nghiêm trọng (fatal error), nhưng nó làm hỏng hệ thống giám sát của bạn. Kể từ khi phát hành PHP 5.3 vào năm 2009, bộ máy PHP đã thực thi nghiêm ngặt việc xử lý thời gian rõ ràng. Nó từ chối đoán dựa trên các thiết lập hệ điều hành không thể dự đoán trước. Nếu bạn không cho PHP biết chính xác múi giờ nào cần sử dụng, nó sẽ đưa ra cảnh báo để buộc tính nhất quán trên các môi trường máy chủ khác nhau.

Tại sao điều này lại xảy raNếu không có múi giờ được xác định, PHP sẽ sử dụng biến môi trường TZ của hệ thống hoặc đồng hồ cục bộ. Nếu những thông tin này có vẻ đáng ngờ hoặc bị thiếu, cảnh báo sẽ được kích hoạt. Việc xác định rõ ràng múi giờ đảm bảo ứng dụng của bạn hoạt động giống nhau cho dù nó đang chạy trên trung tâm dữ liệu ở New York hay vùng đám mây ở Singapore.

Bước 1: Cách khắc phục vĩnh viễn (Chỉnh sửa php.ini)Giải pháp mạnh mẽ nhất là thiết lập chỉ thị date.timezone trên toàn cầu. Điều này đảm bảo mọi tập lệnh trên máy chủ của bạn đều sử dụng cùng một điểm tham chiếu.

  • Xác định vị trí tệp cấu hình. Chạy lệnh php -i | grep "Loaded Configuration File" từ terminal của bạn. Các máy chủ web như Nginx (FPM) hoặc Apache thường sử dụng các tệp cấu hình khác với CLI. Ví dụ, hãy kiểm tra /etc/php/8.3/fpm/php.ini so với /etc/php/8.3/cli/php.ini.- Mở tệp với quyền root:sudo nano /etc/php/8.3/fpm/php.ini- Tìm phần [Date]. Phần này thường nằm ở khoảng dòng 940. Tìm kiếm dòng ;date.timezone =.- Bỏ dấu chú thích và thiết lập múi giờ của bạn:[Date] date.timezone = "UTC"Mẹo nhỏ: Sử dụng "UTC" cho máy chủ để tránh nhầm lẫn về Giờ tiết kiệm ánh sáng ban ngày (Daylight Saving Time), hoặc tìm khu vực của bạn trong danh sách chính thức.- Khởi động lại các dịch vụ của bạn:```

Cho Nginx/PHP-FPM

sudo systemctl restart php8.3-fpm

Cho Apache

sudo systemctl restart apache2 ```### Bước 2: Cách khắc phục ở cấp độ ứng dụngNgười dùng hosting chia sẻ (shared hosting) không thể can thiệp vào php.ini có thể khắc phục điều này trực tiếp trong mã nguồn. Điều này cũng lý tưởng cho các ứng dụng đa người thuê nơi người dùng sống ở các khu vực khác nhau. Thêm dòng này vào tệp bootstrap của bạn (như index.php hoặc config.php) trước khi gọi bất kỳ hàm nào liên quan đến thời gian:

<?php
date_default_timezone_set('America/Los_Angeles');

// Các lệnh gọi hàm date của bạn giờ đây sẽ không còn cảnh báo
echo date('Y-m-d H:i:s');
?>

Bước 3: Khắc phục cho môi trường Docker hoặc CLINếu bạn đang chạy một tập lệnh thực thi một lần hoặc một ứng dụng được container hóa, hãy truyền múi giờ dưới dạng biến môi trường. PHP sẽ tôn trọng biến TZ nếu cấu hình toàn cầu bị thiếu.

# Chạy tập lệnh cục bộ với một múi giờ cụ thể
TZ="Europe/Paris" php my_script.php

# Trong Dockerfile của bạn
ENV TZ=UTC

Cách xác minh kết quảXác minh là bước quan trọng. Chạy một kiểm tra nhanh từ dòng lệnh: php -r "echo date_default_timezone_get();". Nếu nó trả về múi giờ bạn đã chọn (ví dụ: "UTC") mà không có cảnh báo nào phía trước, bạn đã hoàn tất. Để xác minh máy chủ web của bạn, hãy tạo một tệp info.php chứa <?php phpinfo(); ?>, tải nó trong trình duyệt và tìm kiếm hàng "Default timezone".

Xử lý sự cố & Phòng ngừa- Bẫy "Hai tệp cấu hình": Tôi đã thấy nhiều nhà phát triển sửa php.ini cho trang web của họ nhưng sau đó phát hiện các tác vụ Cron vẫn bị lỗi. Luôn kiểm tra cả tệp cấu hình FPM và CLI.- Kiểm tra dấu thời gian (Timestamp) của bạn: Các bản sửa lỗi trên production có thể gây nhầm lẫn. Tôi sử dụng Trình chuyển đổi Timestamp này để xác minh dấu thời gian Unix so với ngày tháng có thể đọc được. Nó hoạt động trên trình duyệt và đảm bảo tính riêng tư, tốt hơn việc dán các tệp nhật ký máy chủ nhạy cảm vào các trang web ngẫu nhiên.- Xoay vòng nhật ký (Log Rotation): Nếu cảnh báo này chạy trong nhiều tuần, tệp error_log của bạn có thể rất lớn. Hãy xóa bớt nội dung để lấy lại dung lượng đĩa: sudo truncate -s 0 /var/log/php-fpm.log.

Related Error Notes