Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] listowanie pierwszego i ostatniego dnia miesiąca
Forum PHP.pl > Forum > Przedszkole
wcg
Witam. Mam taki problem:
Mając np. daty od=15-01-2008, do 27-12-2008, potrzebuję listować w tym przedziale pierwsze i ostatnie dni miesiąca
P: 01-01-2008 O: 31-01-2008
P: 01-02-2008 O: 29-02-2008
P: 01-03-2008 O: 31-03-2008
.... itd.
Myślę ze trzeba zastosować jakąś pętle, ale nie wiem jak się za to zabrac
Może ma ktoś pomysł jak można to zrobić? Z góry serdecznie dziękuje.
marcio
A moze pokaz najpierw jak zapisujesz te daty.
aiv
Możesz przerobić obie daty na timestamp funkcją strtotime() a później dodając do daty ilość sekund przypadających na jeden dzień obserwować zmianę miesiąca. Z funkcji date() wydobędziesz ilość dni w danym miesiącu.
Cezar708
  1. <?php
  2. $rok = '2008';
  3. for ( $i=1; $i<=12; $i++){
  4. if ( !checkdate( $i, 31, $rok ){
  5. if ( !checkdate( $i, 30, $rok ){
  6. if ( !checkdate( $i, 29, $rok ){
  7. $endDate = "28-$i-$rok";
  8. } else {
  9. $endDate = "29-$i-$rok";
  10. }
  11. } else {
  12. $endDate = "30-$i-$rok";
  13. }
  14. } else {
  15. $endDate = "31-$i-$rok";
  16. }
  17.  
  18. echo "P: 01-$i-$rok O: $endDate<br />\n";
  19.  
  20. }
  21. ?>


ewentualnie uprość sobie (uczytelnij) warunki if, nie chciało mi się pisać ładniej smile.gif
wcg
Problem w tym, że to nie koniecznie misi być akurat 12 miesięcy
Takiego skryptu używam żeby uzyskać zakres dat:

  1. <?php
  2. $wynik = mysql_query("SELECT data FROM stat ORDER BY data ASC LIMIT 1");
  3. $aa = mysql_fetch_array($wynik);
  4. $pierwszywpis = $aa['data'];
  5. $od1 = date('Y-m-d', strtotime($pierwszywpis));
  6.  
  7. $wynik = mysql_query("SELECT data FROM stat ORDER BY data DESC LIMIT 1");
  8. $aa = mysql_fetch_array($wynik);
  9. $ostatniwpis = $aa['data'];
  10. $do1 = date('Y-m-d', strtotime($ostatniwpis));
  11.  
  12. echo $od1;
  13. echo $do1;
  14. ?>


I dopiero teraz w tym przedziale potrzebuję pierwsze i ostatnie dni. Liczba tych miesięcy jest nieznana
Cezar708
no to trochę przerób kod:

  1. <?php
  2. $od1miesiac = date('m', strtotime($pierwszywpis));
  3. $do1miesiac = date('m', strtotime($ostatniwpis));
  4.  
  5. $rok = '2008';
  6. for ( $i=$od1miesiac; $i<=$do1miesiac; $i++){
  7. if ( !checkdate( $i, 31, $rok ){
  8. if ( !checkdate( $i, 30, $rok ){
  9. if ( !checkdate( $i, 29, $rok ){
  10. $endDate = "28-$i-$rok";
  11. } else {
  12. $endDate = "29-$i-$rok";
  13. }
  14. } else {
  15. $endDate = "30-$i-$rok";
  16. }
  17. } else {
  18. $endDate = "31-$i-$rok";
  19. }
  20.  
  21. echo "P: 01-$i-$rok O: $endDate<br />\n";
  22.  
  23. }
  24. ?>


.. i powinno ustawić, mam nadzieję, że pomogłem.

EDIT
Oczywiście zakładam, że miesiące są w jednym roku, jeśli nie to trzeba jeszcze trochę kod przerobić.
wcg
Właśnie chodzi o to ze może być taka sytuacja ze daty mogą wystąpić w na przełomie lat
Cezar708
... echh... się dzisiaj trochę napracuję tongue.gif tongue.gif

  1. <?php
  2. $od1rok = date('Y', strtotime($pierwszywpis));
  3. $do1rok = date('Y', strtotime($ostatniwpis));
  4.  
  5. $od1miesiac = date('m', strtotime($pierwszywpis));
  6. $do1miesiac = date('m', strtotime($ostatniwpis));
  7.  
  8. for ( $rok=$od1rok; $rok<=$do1rok; $rok++ ){
  9. for ( 
  10. $i=$od1miesiac; 
  11. // warunek kontynuacji petli
  12. ($rok==$do1rok&&$i<=$do1miesiac)||($rok<$do1rok&&$i<=12); 
  13. $i++
  14.  ){
  15. if ( !checkdate( $i, 31, $rok ){
  16. if ( !checkdate( $i, 30, $rok ){
  17. if ( !checkdate( $i, 29, $rok ){
  18. $endDate = "28-$i-$rok";
  19. } else {
  20. $endDate = "29-$i-$rok";
  21. }
  22. } else {
  23. $endDate = "30-$i-$rok";
  24. }
  25. } else {
  26. $endDate = "31-$i-$rok";
  27. }
  28. echo "P: 01-$i-$rok O: $endDate<br />\n";
  29. }
  30. // nadpisujemy od1miesiac bo w nastepnyhc iteracjach bedziemy daty robić od styczn
    ia 
  31. $od1miesiac = 1;
  32. }
  33. ?>
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.