2009-09-02 9 views
0

J'ai un calendrier PHP qui répertorie tous les jours du mois dans un tableau. Avant le premier jour du mois, j'ai les numéros du mois précédent et après le dernier jour du mois, les numéros des jours pour le mois à venir.Comment créer une fonction permettant de déterminer les dates du dernier jour du mois précédent?

Voici une photo du calendrier sous sa forme actuelle. Comme vous pouvez le voir les chiffres gris bas fonctionnent très bien, mais les chiffres précédant le premier jour du mois sont des nombres négatifs et devraient plutôt apparaître comme '29, 30'

alt text

Les chiffres après le dernier jour du mois étaient simplement '32, 33,34 'par exemple, donc je viens de créer une instruction if qui vérifie si le nombre est supérieur au nombre total de jours du mois en cours et si oui, soustraire le nombre total de jours dans le mois de '32' par exemple, ce qui le ferait alors apparaître comme '1,2,3'.

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

Mon problème est la création d'une instruction if qui, d'une manière ou d'une autre, connaît les derniers jours du mois précédent. Le problème est que certains mois ont 30 jours et d'autres 31 jours. Aussi, le mois de février et les années bissextiles sont un problème. Est-ce que quelqu'un sait une déclaration if, donc je peux le faire apparaître comme '28, 29,30 'du mois précédent?

Répondre

0

En supposant $day est un horodatage UNIX:

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

A partir de là, faire un de ces:

$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]); 

I ne veux pas harponner dessus, mais avez-vous des toilettes ked à mon previous answer? C'est une manière plus robuste de construire un calendrier au lieu de tout ce cas particulier.

+0

J'utilise ce calendrier php: http://iambari.com/2009/05/05/create -an-event-calendar-using-php-et-jquery/et je n'arrive pas à comprendre comment implémenter votre solution. Je ne peux pas savoir où l'ajouter. – zeckdude

+0

Eh bien, si vous êtes en train de pirater un script déjà existant, cela pourrait être un peu difficile. Ma réponse précédente montre simplement une manière différente de construire la table entière du calendrier, ce qui évite tous les problèmes que vous rencontrez. Ma solution est de progresser à travers les dates réelles un jour à la fois et de trouver simplement comment l'afficher, au lieu de passer par les numéros 1 - 31 et essayer de comprendre quel jour il est. Vous devrez probablement réécrire de grandes parties de votre script actuel afin de le faire de cette façon. – deceze

+0

Commencez les jours à partir du dernier dimanche au plus tard le premier jour du mois en cours plutôt qu'à partir du premier jour du mois. Cela corrige tout. –

0

Pourquoi ne pas simplement prendre l'horodatage du premier jour du mois, et en soustraire 24 heures, puis utiliser date('d', $timestamp);? En outre, si vous avez un horodatage dans ce mois, date('t', $timestamp); obtiendra le nombre de jours dans le mois pour vous.

Un exemple rapide:

// 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"; 
} 
+0

Au lieu de soustraire 24 heures, vous devez soustraire 1 jour. La raison en est que parfois les jours ont plus ou moins de 24 heures (par exemple, l'heure d'été, les secondes intercalaires, etc.) qui, si cela arrivait le 1er du mois, mettrait fin à votre calcul. – Asaph

+0

C'est pourquoi j'ai mis l'heure de la date d'origine à 3h du matin, la +/- 1 heure de l'heure d'été ne jette pas la date de wack. Lors de la génération d'un calendrier, l'heure n'a pas d'importance. – gnarf

1

Peut-être que cela peut aider?

cal_days_in_month()

(Sous la direction d'inclure les commentaires des Inshalla)

+0

Je crois que le nom de la fonction est tout en minuscules et vous devriez vraiment lien vers la documentation officielle: http://us2.php.net/manual/fr/fonction.cal-days-in-month.php – Inshallah

+0

merci Inshalla , le lien a été pointé vers le site officiel (je n'ai pas beaucoup fait défiler les résultats google). –

+0

Les moyens de le faire ne manquent pas. Par exemple, avec l'une des fonctions date/heure de PHP: date ('t', strtotime ('mois précédent')) – GZipp

0

En utilisant cal_days_in_month(), diriez-vous d'ajouter le code suivant:

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 
} 

ÉDITÉ: Ajout de la fonction date_format

0

Attendez une minute ...le nom de votre mois en haut est faux! On dit "août 2009", mais le mois a 30 jours et les jours de semaine sont bons pour septembre 2009!

Vous devez d'abord réparer le mois en cours avant de vous soucier des autres mois.