2012-02-05 8 views
5

Mam trzy serwery, wykonując następujące czynności na wszystkich trzech serwerach:Co mogłoby spowodować, że strtotime php nie zadziała na datę w roku 2099?

echo strtotime('2099-12-31'); 
echo strtotime(date('Y-m-d')); 

dostaje mnie:

Serwer # 1: (PHP 5.3.8, 64bit)

4102376400 
1328418000 

Server 2 (php 5.3.2 32bit)

**[nothing]** 
1328418000 

Server # 3: (PHP 5.3.2 - 64-myślałem, że to migh t być problem wersja php)

4102376400 
1328418000 

Co spowodowałoby strtotime niepowodzenie na jednym z serwerów, ale nie innych? Wszystkie trzy mają tę samą domyślną strefę czasową i ustawienia date.timezone w php.ini (nie jestem pewien, czy miałoby to skutek, czy nie). Włączyłem też błędy i nic nie widzę.

+3

Czy serwer 2 jest 32-bitowy? –

+2

Cóż, według przypuszczeń ta data jest wystarczająco duża, aby znaleźć się poza 32-bitową epoką unixów (dowolna data 2038 lub późniejsza). Czy to może być coś 32- czy 64-bitowego? –

+3

jeden z twoich serwerów bierze pod uwagę proroctwo Majów. – dqhendricks

Odpowiedz

9

Prawdopodobnie jest to problem 32-bitowy. To działa dobrze na moim 64-bitowego serwera, ale moja 32-bitowe Ubuntu zwraca false na strtotime('2099-12-31')

Więcej informacji można znaleźć tę notatkę w manual (podkreślając przeze mnie):

prawidłowy zakres znacznika czasu jest zwykle od pt., 13 grudnia 1901 20:45:54 UTC do wt., 19 stycznia 2038 03:14:07 UTC. (Są to daty odpowiadające wartościom minimalnym i maksymalnym dla 32-bitowej liczby całkowitej ze znakiem). Dodatkowo, nie wszystkie platformy obsługują ujemne znaczniki czasu, dlatego zakres dat może być ograniczony do nie wcześniej niż do epoki Unix. Oznacza to, że np. daty sprzed 1 stycznia 1970 r. nie będą działać w systemie Windows, niektórych dystrybucjach systemu Linux i kilku innych systemach operacyjnych. PHP 5.1.0 i nowsze wersje radzą sobie jednak z tym ograniczeniem.

Dla 64-bitowych wersji PHP, prawidłowy zakres znacznika czasu jest faktycznie nieskończony, ponieważ 64 bity mogą reprezentować około 293 miliardów lat w dowolnym kierunku.

+4

Podręcznik PHP jest taki głupi. Istnieje ** duża ** różnica między 293 miliardami a nieskończonością. –

+3

To tam "efektywnie" wchodzi. – ceejayoz

+1

Jedynym efektem jest sprawienie, że zacznę się wzdrygać i piszę te komentarze. –

2

Jak na docs:

Prawidłowy zakres datownika jest zwykle od piątku, 13 grudnia 1901 20:45:54 UTC do Tue, 19 stycznia 2038 03:14:07 UTC. (Są to daty, które odpowiadają wartościom minimalnym i maksymalnym dla 32-bitowej liczby całkowitej ze znakiem.) Ponadto nie wszystkie platformy obsługują ujemne znaczniki czasu, dlatego zakres dat może być ograniczony do nie wcześniej niż do epoki Unix. Oznacza to, że np. daty sprzed 1 stycznia 1970 r. nie będą działać w systemie Windows, niektórych dystrybucjach systemu Linux i kilku innych systemach operacyjnych. PHP 5.1.0 i nowsze wersje radzą sobie jednak z tym ograniczeniem.

Dla 64-bitowych wersji PHP, prawidłowy zakres znacznika czasu jest faktycznie nieskończony, ponieważ 64 bity mogą reprezentować około 293 miliardów lat w dowolnym kierunku.

Wypróbuj np. 2019-12-31, powinien działać zgodnie z oczekiwaniami.

Powiązane problemy