Skocz do zawartości

Błąd w październiku


yavaho

Rekomendowane odpowiedzi

Miałem dziwny błąd w skrypcie i doszedłem w końcu do tego:

Poniższy skrypt wyświetla kolejne numery dni miesiąca.

Jezeli miesiąc ustawi się jako październik czyli wartość 10, to 26 dzień tego miesiąca wyświetli sie dwa razy !

Co tu jest źle?

<?php

$Month=10; 

$StartMonth=mktime(0, 0, 0, $Month, 1, 2008);  //początek miesiąca w sek
$EndMonth=mktime(23, 59, 59, $Month+1, 0, 2008);  //koniec miesiąca w sek

for($a=$StartMonth; $a<$EndMonth; $a+=86400)  //wartość zwiekszana co jeden dzień
  echo(date('d H:i',$a).'<br />'); // wyświetla dzień miesiąca, godz i min

?>

Wyświeta się tam rownież godzina i widać że w tym jenym miejscu brakuje jednej godziny (domyslnie wszedzie powinno być 00:00).

.

Odnośnik do komentarza
Udostępnij na innych stronach

Wiem że mozna to jakoś obejść i zrobić obliczenia innym sposobem ... ale jeżeli nie wiem w czym tkwi błąd i skąd takie bzdury wychodzą to skąd moge być pewny że ten drugi sposób będzie poprawny ;)

Mozna robić różego rodzaju obliczenia i nie zawsze będzie się świadomym że coś jest nie tak.

Teraz jak juz wiem gdzie wystepuje błąd to moge podać np takie przykłady:

echo (mktime(0, 0, 0, 10, 27, 2008) - mktime(0, 0, 0, 10, 26, 2008));

Jakaś data odjąć jeden dzień to powino wyjść 86400 sek a wychodzi 90000

Albo mamy 26 października w sekundach i dodajemy do tego jeden dzień czyli 86400 i w wyniku tego jedna godzina gdzieś wyparowała.

$d26=1224972000;
echo date('Y-m-d H:i',$d26).'<br />';
echo date('Y-m-d H:i',$d26+86400).'<br />';

Mi bardziej odpowiada robienie obliczeń na wartościach sekundowych, tak przynajmniej zoptymalizowana jest cała reszta skryptów. A ten przypadek dalej nie da mi spokoju jeżeli nie dowiem się o co chodzi? :)

W dodatku teraz dopiero zauważyłem że takie błędy wychodzą rownież w innych latach w październiku ale na przełomie innych dni.

edit

Juz wiem

Zmiana czasu na letni i zimowy :P

.

Odnośnik do komentarza
Udostępnij na innych stronach

No może nie koniec świata, a jedynie tzw. problem roku 2038 :D Jak wiemy, Unix przechowuje czas w 32bit zmiennej, zawierającej liczbę sekund które upłyneły od 1 stycznia 1970, godz. 0:00. Maksymalna wartość takiej zmiennej to 2 147 483 647 co odpowiada godzinie 03:14:07 UTC, 19 stycznia 2038.

W następnej sekundzie stan licznika sekund stanie się ujemny – nastąpi przeskok do najmniejszej wartości ujemnej (-2 147 483 648). Wyświetli się wtedy data 13 grudnia 1901 godz. 20:45:52. Może to spowodować poważne błędy w obliczaniu upływu czasu.
Problem roku 2038... ale to już chyba z deka offtop :D

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności