2017-03-31 2 views
0

den folgenden Code Betrachten Sie die perfekt gestern funktioniert, aber jetzt heute (30. März), hat es aufgehört zu arbeiten ...Monate mit weniger als 31 Tagen von der Liste weggelassen

<form class="date"> 
<select name="date" onchange="this.form.submit()"> 

<?php 
    for ($i = 0; $i <= 60; ++$i) { 
    $time = strtotime(sprintf('+%d months', $i)); 
    $value = date('Y-m', $time); 
    $label = date('F Y', $time); 
    $nowvalue = date('Y-m'); 
    $nowlabel = date('F Y'); 
     if(isset($_GET['date'])) { 
      if(strcmp($value,$_GET['date']) == 0) { 
      //If 0, $value and $_GET['date'] are the same: The option is selected 
      printf('<option value="%s" selected>%s</option>', $value, $label); 
      } else { 
      printf('<option value="%s">%s</option>', $value, $label); 
      } 
     } else { 
      if($value == $nowvalue) { 
      printf('<option value="%s" selected>%s</option>', $value, $label); 
      } else { 
      printf('<option value="%s">%s</option>', $value, $label); 
      } 
    } 
    } 
    ?> 
</select> 
</form> 

Dies gibt eine Auswahlliste In den kommenden Monaten lädt diese Änderung die Seite mit einer anderen Abfrage in der URL für den Kalender auf dieser Seite neu, um darauf zu reagieren.

Wenn ich manuell die Abfrage in der URL aktualisieren, es funktioniert gut, aber diese Auswahlliste wiederholt Termine, hat einen Blick auf das Bild unten ...

enter image description here

Dies kann nicht Zufall sein, dass alle Monate mit den kürzesten Tagen fehlen oder tatsächlich mit dem gleichen Namen wie im Vormonat ersetzt wurden?

Hat jemand eine Idee, warum das passieren könnte?

+3

Diese Fragen kommen jeden 31. des Monats ... –

Antwort

0

Wie John Conde darauf hinwies, liegt das daran, dass die heutigen Daten (der 31.) plus ein Monat der 1. Mai ist und der April übersprungen wird.

ich folgendes tat das Datum auf den 1. des Monats einzustellen, dann einen Monat nach ...

<?php 
    for ($i = 0; $i <= 60; ++$i) { 
    $firstofthismonth = '01-' . date('m-Y'); 
    $time = strtotime(sprintf($firstofthismonth . '+%d months', $i)); 
    $value = date('Y-m', $time); 
    $label = date('F Y', $time); 
    $nowvalue = date('Y-m'); 
    $nowlabel = date('F Y'); 
     if(isset($_GET['date'])) { 
      if(strcmp($value,$_GET['date']) == 0) { 
      //If 0, $value and $_GET['date'] are the same: The option is selected 
      printf('<option value="%s" selected>%s</option>', $value, $label); 
      } else { 
      printf('<option value="%s">%s</option>', $value, $label); 
      } 
     } else { 
      if($value == $nowvalue) { 
      printf('<option value="%s" selected>%s</option>', $value, $label); 
      } else { 
      printf('<option value="%s">%s</option>', $value, $label); 
      } 
    } 
    } 
    ?> 
+0

Sie sollten dies jetzt als akzeptiert markieren können :) –

3

Dies liegt daran, wenn Sie Daten auf einer monatlichen Basis am 31. des Monats durchlaufen Sie Monate, die weniger als 30 Tage haben. PHP passt das Datum automatisch an den letzten Tag des Monats an, geht aber ans Ende des Monats und fügt dann die verbleibenden Tage hinzu und erhält das Datum, das den nächsten Monat darstellt.

Wenn Sie also zum Februar kommen, der nur 28 Tage (die meisten Jahre) hat, wird es am 28. und fügen Sie drei Tage hinzu und geben Sie den 3. März.

Um dies zu lösen, müssen Sie das Datum auf den ersten Tag des Monats einstellen und dann die Daten durchlaufen.

+0

Danke für Ihren Kommentar, ich verstehe, was passiert jetzt, diese Zeile ändern half jedoch nicht. Ich hätte gedacht, $ time = strtotime (sprintf ('+% d Monate', $ i)); wäre der Täter, weil es einen Monat vom 31. März, der als 1. Mai herauskommt, wenn seine 30 Tage richtig sind? – Collins

+0

Ich habe mir das nur angeschaut. Unglücklicherweise haben Sie den Code entfernt, der Ihnen dabei geholfen hätte, die Änderung zu bestimmen, aber nehmen Sie kurz das Datum, an dem Sie gerade durchgehen, und ändern Sie es zum Ersten des Monats. Das wird dein Problem lösen. –

+0

Danke, ich habe es jetzt herausgefunden, werde eine separate Antwort posten. – Collins

1

Dies ist nur ein FYI, wie ich, dass Sie erkennen, haben Sie Ihre eigene Antwort hinzugefügt.

Sie könnten stattdessen DateTime() verwenden, um Ihren Code zu vereinfachen (wenn Sie möchten).

So könnte man mit etwas wie Ende:

<select name="date" onchange="this.form.submit()"> 

    <?php 

    $selected = DateTime::createFromFormat('Y-m-d', @$_GET['date'] . '-01') ?: new DateTime('first day of this month'); 

    for ($i = 0; $i <= 60; $i++) { 

     $date = (new DateTime('first day of this month'))->modify("+$i months"); 

     $select = $date == $selected ? 'selected' : ''; 

     printf('<option value="%s" %s>%s</option>', $date->format('Y-m'), $select, $date->format('F-Y')); 

    } 
    ?> 

</select> 

hoffe, das hilft!

Verwandte Themen