Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kalendarz w php - problem z majem 2011
Forum PHP.pl > Forum > Przedszkole
Focuss
Witam
Mam bardzo dziwny problem. Jakiś czas temu wykonałem kalendarz na swoją stronę i wszystko działało jak należy, (kalendaarz składa się z układu miesiąca i układu dnia). Układ dnia działa bardzo ładnie natomiast w momencie nadejścia 1 maja 2011 roku dzień jest przesunięty w lewo o 1 stronęexclamation.gif Czyli 1 maj to poniedziałek a nie niedziela i tak się to ciągnie do końca miesiąca... reszta miesięcy do tej pory była ok i od czerwca dalej też układ jet OK.

Proszę o pomoc jak rozwiązać ten problem

Skrypt:

  1. // wyswietlenie kalendarza w ukladzie miesiaca
  2. echo '<center><h2>Kalendarz</h2></center>';
  3. echo '<hr />';
  4. echo '<table align="center" width="25%" id="calendar">';
  5. echo '<tr id="calendar_header"><th colspan="7">';
  6. echo '<a href="' . htmlspecialchars($_SERVER['PHP_SELF']) . '?t=' .
  7. ($timestamp - 2629743) . '">&lt;</a> &nbsp;';
  8. echo strtoupper(strftime('%B', $timestamp)) . ' ' . $year;
  9. echo '&nbsp; <a href="' . htmlspecialchars($_SERVER['PHP_SELF']) . '?t=' .
  10. ($timestamp + 2629743) . '">&gt;</a>';
  11. echo '</th></tr>';
  12. echo '<tr><th>Pon</th><th>Wto</th><th>Śro</th><th>Czw</th>' .
  13. '<th>Pią</th><th>Sob</th><th>Nie</th></tr>';
  14. $current = 1;
  15. while ($current <= $total_days)
  16. {
  17. echo '<tr class="calendar_dates">';
  18. for ($i = 1; $i < 8; $i++)
  19. {
  20. if (($current == 1 && $i < $first_day_of_month) ||
  21. ($current > $total_days))
  22. {
  23. echo '<td class="empty">&nbsp</td>';
  24. continue;
  25. }
  26. echo '<td><a href="' . htmlspecialchars($_SERVER['PHP_SELF']) .
  27. '?t=' . mktime(0, 0, 0, $month, $current, $year) . '">' .
  28. $current . '</a></td>';
  29. $current++;
  30. }
  31. echo '</tr>';
  32. }
  33. echo '</table>';
  34.  
Gość
Błąd leży tutaj:
  1. ($current == 1 && $i < $first_day_of_month)


current na starcie ma 1 ale 1 dzień miesiąca nie musi zaczynać się od poniedziałku ;]

Pozdrawiam wink.gif
Focuss
ale czemu inne miesiące działają prawidłowo?
celbarowicz
Algorytm ma błędy-nie analizowałem go. To samo będzie dla 1 stycznia 2012 roku, 1 kwietnia 2012=-> czyli dla miesięcy w których pierwszym dniem miesiąca jest niedziela.
Pozdrawiam.
Focuss
Witam
Niestety nie wiem jak zabardzo poprawić ten algorytm. Jest mi może ktoś w stanie pomóc, pewnie dla wielu z was to prosta sprawa natomiast ja nie bardzo jak narazie sobie z tym radzę sad.gif

Proszę o pomoc

Dzięki
Daiquiri
  1. if (($current == 1 && $i < $first_day_of_month) || ($current > $total_days))
czyli :

Jeżeli (dzień dzisiejszy jest równy 1 i licznik jest mniejszy od pierwszego dnia miesiąca) lub dzień dzisiejszy jest większy od wszystkich dni. Jaka jest wartość wszystkich dni ($total_days) ? Może tam powinno być $current >= $total_days

Focuss
niestety nie pomogło
Daiquiri
Nadal nie napisałeś ile to jest total days. Domyślam się, że powyższy warunek nie zostaje spełniony (gdy pierwszym dniem miesiąca jest niedziela), albo zasadniczo zostaje spełniony o "raz za mało" / "za dużo" stąd przesunięcie. Może rozbij go na dwa, wsadź w środek znak, który będzie identyfikował warunek i wtedy może się trochę rozjaśni smile.gif.
Focuss
$total_days = date('t', $timestamp);
$first_day_of_month = date('w', mktime(0, 0, 0, $month, 1, $year));

tyle że właśnie nie wiem doladnie jak to rozbić...
Daiquiri
$first_day_of_month chyba nie śmiga, co? Dla maja powinno być 7, a ile Ty masz?

Tylko coś takiego przychodzi mi na myśl
  1. $first_day_of_month = strftime("%w", mktime(0, 0, 0, $miesiac, 1, 2011));
numer pierwszego dnia tygodnia gdzie niedziela to 0. Oczywiście musisz wsadzić coś w zmienną $miesiac i ustawić rok smile.gif.

Edit: dla Ciebie chyba lepiej by było %u nie %w smile.gif Bo wtedy niedziela to 7.
Focuss
niestety nadal układ jest tak jak wcześniej sad.gif
Daiquiri
No to UNŚ - u mnie śmiga. Sprawdź wszystkie zmienne czy są odpowiednie.
Focuss
Wielkie dzięki z %u działa super!!

A jeśli mogę to mam jeszcze 1 pytanko, odnośnie przewijania na następny miesiąc. To przewijanie które ja zastosowałem przewija o 31dni i czasami jest to problematyczne gdyż przeskakuje następny miesiąc. Czy jest możliwość by przeskakiwał zawsze na 1 dzień następnego miesiąca?
Daiquiri
Zamiast korzystać z dokładnych danych ustawiaj +/- jeden miesiąc i na sztywno pierwszy dzień miesiąca.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.