„Date (): poleganie na ustawieniach strefy czasowej systemu nie jest bezpieczne…”


359

Wystąpił ten błąd, gdy poprosiłem o aktualizację wersji PHP z 5.2.17 do PHP 5.3.21 na serwerze.

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

Odpowiedzi:


556

Prawdopodobnie musisz umieścić strefę czasową w wierszu konfiguracji w swoim php.inipliku. Powinieneś mieć taki blok w swoim pliku php.ini:

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

Jeśli nie, dodaj go (zastępując strefę czasową swoją). Po skonfigurowaniu ponownie uruchom httpd ( service httpd restart).

Oto lista obsługiwanych stref czasowych .


12
dla jasności, po wprowadzeniu tej zmiany, pamiętaj o ponownym uruchomieniu usługi sudo apache2
Ryan

2
To rozwiązało dla mnie, gdy inne rozwiązania nie. Ten błąd pojawił się tylko wtedy, gdy korzystałem z funkcji daty na tej samej stronie co integracja z Amazon SES. Może to pomoże komuś innemu.
master_gracey,

9
Jeśli używasz interfejsu CLI PHP (php -r lub php -a) w terminalu klienta, musisz edytować plik php.ini CLI, a nie apache2. Plik php.ini w interfejsie C można zwykle znaleźć na stronie /etc/php5/cli/php.ini
justinpage

2
Podobnie jak pierwszy komentarz na temat Apache, musisz także zrestartować IIS, aby zadziałało na Windows / IIS.
dniu

2
To rozwiązuje mój problem! Tylko informacja dla nie-ekspertów takich jak ja, aby znaleźć php.iniużywane przez apache, po prostu wykonaj następujące polecenie php -i | grep php.ini.
Joël Salamin

198

Jeśli nie możesz zmodyfikować konfiguracji php.ini, możesz również użyć następującego fragmentu kodu na początku kodu:

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

Lista stref czasowych znajduje się na stronie http://www.php.net/manual/en/timezones.php .


7
Z jakiegoś powodu ustawienie date.timezone = America / New_York w moim php.ini i zrestartowaniu Apache nie zatrzymało tego komunikatu o błędzie podczas uruchamiania skryptu za pomocą swiftmailer. Skończyło się też na dodaniu date_default_timezone_set ('America / New_York'); u góry skryptu, zgodnie z sugestią. Dzięki!
kyle

Próbowałem twojego rozwiązania. Teraz błąd to 500 wewnętrzny błąd serwera. Używam Apache 2.x i Codeigniter.
Hafiz Shehbaz Ali

@ShehbazAli Musisz zrobić coś złego. W którym ze swoich skryptów dodałeś fragment kodu?
Babatunde Adeyemi

ten sam kod działa na produkcji. Nie ma błędu. Apache, php i MySQL zainstalowałem ręcznie w oknie 10. PHP, MySQL i Apache działają. Ale ten projekt daje błąd.
Hafiz Shehbaz Ali

72

Dodaj następujące elementy do swojego index.phppliku. Po raz pierwszy zetknąłem się z tym, kiedy przeniosłem moją aplikację z mojego serwera XAMPP na Apache 2.2 i PHP 5.4 ...

Radzę ci to zrobić w swoim index.phppliku zamiast w php.inipliku.

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

3
doskonałe rozwiązanie, gdy niekoniecznie masz pełny dostęp do systemu, zgadnij, że ten jest dla osób z ograniczonym dostępem lub potrzebujesz bardziej niezawodnego rozwiązania, a jeśli to możliwe,
połącz

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

zamiast

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

pracował dla mnie (pokazuje bieżący rok i nie wyświetla już komunikatu o błędzie). (Dzięki Chrisowi powyżej)


15

Jeśli to nie są twoje opcje

  • Modyfikowanie php.ini.
  • Dodawanie date_default_timezonepołączenia.

Zamiast dateciebie możesz użyć gmdate.

Użyłem go, gmdate( "Y" )gdy potrzebowałem roku na fragment kodu z prawami autorskimi.


14

Jeśli używasz CodeIgniter i nie możesz zmienić php.ini, dodałem następujące na początku index.php:

date_default_timezone_set('GMT');

Działa dla mnie, dziękuję Jose za twoją pomoc. Z pozdrowieniami, Sarim Ghani i-splendid.com
Sarim Shekhani

Działa to na macierzystym php php.net/manual/en/function.date-default-timezone-set.php . TY, stawiasz mnie na właściwej drodze. W związku z tym zobacz listę stref czasowych dla funkcji tutaj php.net/manual/en/timezones.php
Louis Loudog Trottier


11

@Justis wskazał mi właściwy kierunek, ale jego kod nie działał dla mnie. To spowodowało:

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

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

To rozwiązanie jest nie tylko dla tych, którzy nie mają pełnego dostępu do systemu. Jest niezbędny dla każdego skryptu, jeśli udostępniasz go komukolwiek innemu oprócz ciebie. Nigdy nie wiadomo, na jakim serwerze skrypt będzie działał, gdy przekażesz go komuś innemu.


5

Ten problem od pewnego czasu mnie denerwuje, gdy próbuję wstrzyknąć kompozytorowi skrypt „createbucket.php” i ciągle słyszę, że moja strefa czasowa jest niepoprawna.

Ostatecznie jedyną rzeczą, która rozwiązała ten problem, było: $ sudo nano /etc/php.ini

Wyszukaj strefę czasową

[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

Upewnij się, że usunąłeś ;

W końcu

$ sudo service httpd restart

I będziesz dobrze iść :)


5

Musiałem umieścić to w podwójnych cudzysłowach.

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

Nadal nie ma workie (w Mac OSX), więc w końcu się /etc/php.ini: date.timezone = America/Los_Angeles
zepsułem

3

Możesz ustawić strefę czasową w swoim .htaccesspliku

php_value date.timezone UTC

Powinno to działać w przypadku, gdy php.ini nadal zwraca ostrzeżenie, mimo że zostało ustawione (php 5.4. *). Pracował dla mnie.
Christian Bonato,

2

Oprócz ustawienia date.timezone = jak wspomniano w kilku odpowiedziach, znalazłem błąd w pliku php.ini, który uniemożliwiał mu przejście do date.timezone. Znalazłem to, uruchamiając php z wiersza poleceń w terminalu. spowodowało to zgłoszenie błędu w wierszu 114. W moim przypadku odkomentowałem ustawienie wyświetlania błędów, które miały „|” między 2 wartościami. Nie podobało mi się to. Usunąłem jedną z wartości i | i potem wszystko było dobrze


1

Prosta metoda dla dwóch stref czasowych.

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

Szybkim rozwiązaniem podczas usuwania niezgodności jest wyłączenie raportowania błędów w index.phppliku:

Wstaw poniższy wiersz do swojego index.php poniżejdefine( ‘_JEXEC’, 1 );

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

0

Hostuję mój segment EC2 i S3 w regionie us-west-2 (Oregon). Kiedy dzwoniłem $s3client->listBuckets()do listy istniejących wiader w php, otrzymywałem wyjątek - "Uncaught exception 'Exception' with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings...". wprowadziłem poniższe zmiany, aby to działało. Udostępnianie tych danych na wypadek, gdyby ktoś napotkał podobny problem i żadna z powyższych odpowiedzi nie pomogła.

  1. Na podstawie dokumentacji @ AWS Configuring Network Time Protocol (NTP) potwierdziłem, że status usługi ntpd działa poprawnientpstat polecenie. Jeśli wystąpi błąd, ten link pomoże Ci dowiedzieć się, co się dzieje.
  2. Otwarty plik /etc/php.ini (niektóre mogą mieć inną ścieżkę w oparciu o zainstalowaną wersję php) i stwierdził, że date.timezonenie ustawiono żadnej wartości, a także został domyślnie skomentowany. Nie skomentowałem, usuwając ';' przed tym wierszem i ustaw jego wartość na"UTC" i zapisz plik.
  3. Zrestartowano demony HTTP i NTTP za pomocą poleceń sudo service httpd restarti sudo service ntpd restart.

Po tym jestem w stanie wyświetlić listę wiader bez żadnych wyjątków. Mam nadzieję że to pomoże.


0

Jeśli używasz Plesk, spróbuj, Najpierw otwórz Ustawienia PHP, na dole strony zmień date.timezone z DEFAULT na UTC.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj


0

Miałem ten błąd podczas uruchamiania php-fpm w więzieniu chroot. Próbowałem utworzyć etc / php.ini i / usr / share / zoneinfo w katalogu chroot, ale to po prostu nie działało. Próbowałem nawet śledzić demony php-fpm, aby zobaczyć, jakiego pliku brakuje - nic nie wyskoczyło.

Jeśli więc Google cię tu sprowadza, ponieważ pojawia się ten błąd, gdy używasz php-fpm skonfigurowanego dla chroot, prawdopodobnie możesz to naprawić, dodając ten wiersz do /etc/php-fpm.d/www.confsekcji ENV:

env[TZ] = America/New_York

Ponowne uruchomienie php-fpm jest zwykle wymagane, aby zadziałało. Mam nadzieję, że to pomoże komuś tam.


0

W moim konkretnym przypadku mam skonfigurowane PHP do korzystania z PHP-FPM (FastCGI Process Manager). Podczas uruchamiania phpinfo()z CLI widziałem poprawną strefę czasową, którą ustawiłem w php.ini, jednak nadal była niepoprawna w przeglądarce i powodowała awarię mojego kodu. Po prostu potrzebowałem zrestartować php-fpmusługę na serwerze.

service rh-php56-php-fpm restart

Może być również konieczne ponowne uruchomienie httpdusługi, jeśli edytowałeśphp.ini

service httpd restart

0

Powyższa odpowiedź z CtrlX jest poprawną odpowiedzią, ale może nie działać całkowicie. Dodałem tę linię do mojego pliku php.ini :

date.timezone = "America/Los_Angeles"

ale nie usunęło błędu PHP dla wszystkich moich plików, ponieważ niektóre z moich skryptów PHP znajdują się w podfolderach. Musiałem więc edytować plik .htaccess , aby skonfigurować php.ini, aby był używany rekurencyjnie (w podfolderach):

suphp_configpath /home/account_name/public_html

gdzie nazwa_konta to nazwa konta cpanel, a public_html to folder, w którym znajduje się plik php.ini.


0

Dla użytkownika dockera: Utwórz lokalny plik timezone.ini w swoim projekcie, skonfiguruj config w docker-compose.yml,

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

timezone.ini

    date.timezone=Australia/Sydney

0

Jeśli nie masz dostępu do pliku php.ini, utwórz lub edytuj .htaccessplik w katalogu głównym domeny lub sub i dodaj go (wygenerowany przez 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>

Staraj się nie używać wielkich słów, na wypadek gdyby normalna konwencja obudów mogła wyrazić to, co chcesz powiedzieć.
shizhen

0

Istnieją dwie opcje rozwiązania tego

Najpierw przejdź do pliku php.ini i ustaw domyślną strefę czasową

date.timezone = "America/New_York"

Po ustawieniu strefy czasowej w php.ini zrestartuj serwer

Po drugie, zmień strefę czasową przypisania czasu wykonywania w zależności od potrzeb

date_default_timezone_set('America/New_York');

-1

Na stronie połączenia umieść taki kod date_default_timezone_set("Africa/Johannesburg");na podstawie bieżącej lokalizacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.