[PHP] Calcolo giorno

z.cristiano

Utente Attivo
16 Giu 2007
145
0
16
Buonasera...
una spiegazione che riguarda al calcolo di data..

Se io registro lunedì 7 novembre 2016 e automaticamente dovrei sapere quanti lunedì ci sono per un mese di novembre e una lista di giorni ogni lunedì..

Mi ricordo che è il codice MKTIME ma non mi ricordo cosa va aggiunto il codice in modo che se io registro esempio MERCOLEDI', deve automaticamente apparire quanti mercoledì sono disponibili per il tutto il mese di novembre e anche facendo il ciclo specificando il giorno di ogni mercoledì...faccio esempio per spiegare meglio

Digito MERCOLEDI' 9 NOVEMBRE, il sistema calcola e appaia:
- In questo mese di NOVEMBRE ci sono 3 MERCOLEDI' disponibili ovvero
giorno 9 novembre
giorno 16 novembre
giorno 23 novembre
giorno 30 novembre

E' possibile?
 
Buonasera...
una spiegazione che riguarda al calcolo di data..

Se io registro lunedì 7 novembre 2016 e automaticamente dovrei sapere quanti lunedì ci sono per un mese di novembre e una lista di giorni ogni lunedì..

Mi ricordo che è il codice MKTIME ma non mi ricordo cosa va aggiunto il codice in modo che se io registro esempio MERCOLEDI', deve automaticamente apparire quanti mercoledì sono disponibili per il tutto il mese di novembre e anche facendo il ciclo specificando il giorno di ogni mercoledì...faccio esempio per spiegare meglio

Digito MERCOLEDI' 9 NOVEMBRE, il sistema calcola e appaia:
- In questo mese di NOVEMBRE ci sono 3 MERCOLEDI' disponibili ovvero
giorno 9 novembre
giorno 16 novembre
giorno 23 novembre
giorno 30 novembre

E' possibile?
PHP:
$giorni = array('Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato');
$data = "2016-11-01";
echo $giorni[date('w',strtotime($data))];

con il codice sopra cicli i giorni del mese e estrai solo quelli che ti interessano

ciao
 
PHP:
<?php

function calcola_giorni($giorno,$mese,$anno) {
    $data = $anno."-".$mese."-".$giorno; // imposto la data nel formato Y-m-j
    $unix = strtotime($data); // timestamp unix
    $day = strtolower(date("D",$unix)); // trovo il giorno corrispondente alla data inserita

    $giorni = array(date("j-m-Y",$unix)); // creo l'array in cui finiranno tutti i lun/mar/.../dom del mese
    $m = $mese; //servirà per controllare la condizione in un ciclo while
    $i=1; // inizializzo una variabile che mi servirà per l'inserimento dei vari giorni in un array
    while ($m == $mese) { // finché il mese è quello di partenza
        $prossimo = $unix+86400*7; // calcola che giorno è tra una settimana
        $giorni[$i] = date("j-m-Y",$prossimo); // aggiungilo all'array sottoforma di data
        $i++; // incremento l'indice dell'array
        $m = date("m",$prossimo+86400*7); // incremento $m (serve per il controllo nel ciclo while)
        $unix = $prossimo;
    }
    // array $transcod per passare dai nomi in inglese a quelli in ita
    $transcod['mon'] = "Lunedì";
    $transcod['tue'] = "Martedì";
    $transcod['wed'] = "Mercoledì";
    $transcod['thu'] = "Giovedì";
    $transcod['fri'] = "Venerdì";
    $transcod['sat'] = "Sabato";
    $transcod['sun'] = "Domenica";
    // stampa dei giorni
    echo "In questo mese ci sono ".count($giorni)." ".$transcod[$day]." disponibili, ovvero: <br>";
    foreach ($giorni as $key => $value) {
        echo $transcod[$day]." ".$value."<br>";
    }
}

calcola_giorni(1,9,2016);

 ?>

Questo l'output:
In questo mese ci sono 5 Giovedì disponibili, ovvero:
Giovedì 1-09-2016
Giovedì 8-09-2016
Giovedì 15-09-2016
Giovedì 22-09-2016
Giovedì 29-09-2016
 
Grande....funziona...

Ma perdonami una cosa perchè sto davvero impazzendo...

Se volessi che elencassi i numeri di giorno ogni giovedi a partire da settembre 2016 a febbraio 2017?

Cioè, se seleziono MERCOLEDI' facendo questo calcolo che numeri sono ogni mercoledì da settembre 2016 a febbraio 2017?
 
PHP:
<?php
$dtmin = '2016-09-01';
$dtmax = '2017-02-28';
$cerco = 'giovedi';

$nomi = array('Mon'=>'lunedi','Tue'=>'martedi','Wed'=>'mercoledi','Thu'=>'giovedi','Fri'=>'venerdi','Sat'=>'sabato','Sun'=>'domenica');
$diff = '+1 day';
$conta = 0;

for ( $dt=$dtmin; $dt<=$dtmax; )
{
    $date = new DateTime($dt);
    $giorno = $nomi[$date->format('D')];

    if ($giorno == $cerco)
        {
        echo $giorno.$date->format(' d/m/Y')."<br />";
        $diff = '+1 week';
        $conta++;
    }
    $date = $date->modify($diff);
    $dt   = $date->format('Y-m-d');
}
echo "ho trovato ".$conta." ".$cerco."<br /> <br />";

se ci fosse la localizzazione installata, non occorrerebbe la traduzione dei nomi,
ma non essendo "standard" meglio questa soluzione
 
Ultima modifica:

Discussioni simili