Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kalendarz w php - problem z majem 2011, dziwny problem
Focuss
post 12.05.2011, 09:23:45
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


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 to the top of the page
+Quote Post
-Gość-
post 12.05.2011, 14:26:30
Post #2





Goście







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
Go to the top of the page
+Quote Post
Focuss
post 16.05.2011, 14:34:57
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


ale czemu inne miesiące działają prawidłowo?
Go to the top of the page
+Quote Post
celbarowicz
post 16.05.2011, 22:24:59
Post #4





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Focuss
post 26.05.2011, 07:11:06
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Daiquiri
post 26.05.2011, 08:44:45
Post #6





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




  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

Go to the top of the page
+Quote Post
Focuss
post 26.05.2011, 08:51:53
Post #7





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


niestety nie pomogło
Go to the top of the page
+Quote Post
Daiquiri
post 26.05.2011, 09:01:42
Post #8





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




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.
Go to the top of the page
+Quote Post
Focuss
post 26.05.2011, 09:18:17
Post #9





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


$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ć...

Ten post edytował Focuss 26.05.2011, 09:24:38
Go to the top of the page
+Quote Post
Daiquiri
post 26.05.2011, 09:29:07
Post #10





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




$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.
Powód edycji: [Daiquiri]:
Go to the top of the page
+Quote Post
Focuss
post 26.05.2011, 09:47:34
Post #11





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


niestety nadal układ jest tak jak wcześniej sad.gif
Go to the top of the page
+Quote Post
Daiquiri
post 26.05.2011, 09:48:26
Post #12





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




No to UNŚ - u mnie śmiga. Sprawdź wszystkie zmienne czy są odpowiednie.
Go to the top of the page
+Quote Post
Focuss
post 26.05.2011, 15:01:45
Post #13





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 27.12.2010

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Daiquiri
post 26.05.2011, 17:22:29
Post #14





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Zamiast korzystać z dokładnych danych ustawiaj +/- jeden miesiąc i na sztywno pierwszy dzień miesiąca.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 11:12