Nasıl önceki ayın son günü tarihlerini anlamaya bir işlev oluşturabilirsiniz?

6 Cevap php

Bir tabloda ayın gün listeleyen bir PHP takvim var. Ayın ilk gününden önce ben önceki aya numaraları ve ayın son gününden sonra önümüzdeki ay için gün sayılardır.

İşte şu anda göründüğü Takvim bir fotoğraf bulunuyor. Eğer alt gri numaralarını görebileceğiniz gibi iyi çalışıyor, ama ayın ilk günü önceki sayılar negatif sayılardır ve bunun yerine '29, 30 'gibi görünmelidir edilir

alt text

Ayın son gününden sonra sayılar, örneğin sadece ''32, 33,34 vardı, bu yüzden ben sadece numara eğer öyleyse, o zaman cari ayın gün toplam sayıları daha büyüktür ve denetler bir if deyimi yarattı 'o '1, 2,3 gibi görünür kılacak olan, örneğin' '32 gelen ayın gün toplam sayıyı çıkarmak.

if ($day > $total_days_of_current_month) {
  echo '<td>' . ($day - $total_days_of_current_month) . ' </td>'; // for example,33-31=2
}

Benim sorunum bir şekilde önceki ayın son günü ne oldu biliyor bir if deyimi yaratıyor. Sorun birkaç ay 30 gün var ve yaklaşık 31 gün olması. Ayrıca, Şubat ve artık yıl ay bir sorun vardır. Herkes biliyor mu bir deyim yani eğer i önceki aya '28, 29,30 'olarak görünmesini sağlayabilirsiniz?

6 Cevap

$day UNIX zaman damgası olduğunu varsayarsak:

// gets you the first of the month
$date = getdate(mktime(0, 0, 0, date('n', $day), 1, date('Y', $day)));

Burada, bunlardan birini yapın:

$lastDayOfPrevMonth = strtotime('-1 day', $date[0]);

// or, better, get the first day "in the grid" (assuming week starts on Sunday)
$date = strtotime("-$date[wday] days", $date[0]);

Bunun üzerinde durmak istemiyorum, ama sen benim previous answer baktım? Bu bir takvim yerine, tüm bu özel durum kontrol oluşturmak için daha sağlam bir yoldur.

Belki de bu yardımcı olabilir?

cal_days_in_month()

(Inshalla geri bildirim eklemek için düzenlenmiş)

Neden sadece ayın ilk günü damgası almak ve ondan 24 saat çıkarmak ve daha sonra kullanmak date('d', $timestamp);? Değil Eğer o ay bir zaman damgası varsa da, date('t', $timestamp); sizin için ayın gün sayısını alacak.

Hızlı bir örnek:

// sets to 3am, first day of month, 3am helps us avoid DST issues with subtracting hours    
$monthStart = mktime(3,0,0,date('n'),1,date('Y')); 
$thisMonth = date('n', $monthStart);

// rewind to the sunday before- date('w') is the "weekday" 0 based    
$date = $monthStart - (date('w',$monthStart) * 60 * 60 * 24);     

while ($date<$monthStart || date('n', $date) == $thisMonth)
{
  echo "<tr>";
  for ($x=0; $x<7; $x++) {
    echo "<td";
    if (date('n', $date) != $thisMonth) echo " class='notMonth'";
    echo ">";
    echo date("j", $date);
    echo "</td>";
    $date += 60*60*24;
  }
  echo "</tr>\n";
}

PHP-Kalender-Sınıf Projesi kaynağını bir göz atın:

http://code.google.com/p/php-calendar-class/

sınıf kaynağı: http://code.google.com/p/php-calendar-class/source/browse/trunk/calendar.class.php

Size sorun bazı fikir verebilir.

Cal_days_in_month () kullanarak, nasıl aşağıdaki kodu ekleme hakkında:

if ($day < 1) {
  echo '<td>' . ($day + cal_days_in_month(
     CAL_GREGORIAN,date_format("n",
         date_add(date_create(),"P-1M")))) . ' </td>'; // for example,-1 + 30 = 29th
}

REDAKTE: DATE_FORMAT fonksiyonu eklendi

Dur bir dakika ... üstündeki ay adı yanlış! Bu "Ağustos 2009" diyor, ama ay 30 gün var ve hafta içi Eylül 2009 için doğru yerdesiniz!

Diğer aylarda endişesi önce, ilk olarak geçerli ay onarmak gerekir.