Calendario da 16 mesi
Calendario da 16 mesi postato il 18/10/2015 22:59:50 nel forum programmazione, open source e hosting
Salve a tutti. Dovrei creare un calendario per un gioco che sto realizzando. Non sapendo come fare ho cercato online dei codici per generare un calendario (ce ne sono moltissimi online) per poi modificarlo in base alle mie esigenze. Per ovvi motivi tutti i codici che si trovano online si basano su un anno composto da 12 mesi e visualizzano la data corrente. Qui sorge il mio problema: a me servirebbe un calendario da 16 mesi, i primi 15 con 24 giorni (4 settimane da 6 giorni) e l'ultimo da 5 (6 se anno bisestile).
Il codice che ho trovato online inizia così:
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
$dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
$dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
$dati['anno'] = date("Y", time()); // Anno
$dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno'])); // Giorno della settimana del primo giorno dell'anno
$dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28; // Calcolo dei giorni di febbraio
$dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente
$dati['settimane_mese'] = ceil($dati['giorni_mese']/7); // Settimane del mese corrente arrotondato per eccesso.
E io ho iniziato a modificarlo in questa maniera:
$dati['giorni_mesi'] = array(24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0); // Array con i giorni dei mesi
$dati['anno'] = date("Y", time()) - 2014; // Anno
$dati['giorni_mesi'][15] = (($dati['mese_num']%400) == 0) ? 6 : 5; // Calcolo dell'ultimo mese
switch($dati['mese_num']){
case 1: $dati['mese_text']='mese 1'; break;
case 2: $dati['mese_text']='mese 2'; break;
case 3: $dati['mese_text']='mese 3'; break;
case 4: $dati['mese_text']='mese 4'; break;
case 5: $dati['mese_text']='mese 5'; break;
case 6: $dati['mese_text']='mese 6'; break;
case 7: $dati['mese_text']='mese 7'; break;
case 8: $dati['mese_text']='mese 8'; break;
case 9: $dati['mese_text']='mese 9'; break;
case 10: $dati['mese_text']='mese 10'; break;
case 11: $dati['mese_text']='mese 11'; break;
case 12: $dati['mese_text']='mese 12'; break;
case 13: $dati['mese_text']='mese 13'; break;
case 14: $dati['mese_text']='mese 14'; break;
case 15: $dati['mese_text']='mese 15'; break;
case 16: $dati['mese_text']='mese 16'; break;
} //switch per il nome del mese testuale
Il problema è che non so come fare le seguenti cose:
1) modificare gli altri parametri: questi infatti si basano su giorno, mese e settimana attuale, che sono assai diversi da quelli che servono a me, avendo mesi con un numero di giorni e settimane differenti; i parametri che non riesco a modificare sono, dunque:
- $dati['mese_num']
- $dati['oggi']
- $dati['oggi_sett']
- $dati['start']
2) fargli capire che il primo giorno del primo mese deve coincidere con quello che per noi è il 1° marzo.
Spero di essere stato chiaro su quali siano i miei problemi. In caso contrario ditemelo che provo a spiegarmi meglio.
Grazie.
Pagine → 1
19/10/2015 15:00:28
Secondo me ti stai dannando un po' troppo per una cosa drasticamente più banale.
Conti il numero di giorni REALI dalla data di inizio del tuo calendario (che chiameremo anno 0)
Ogni 24 giorni sottrai 24 ai giorni e aggiungi 1 al mese.
Continuando così ad un certo punto ti sarà impossibile fare un ulteriore raggruppamento per 24. Quelli sono gli "ultimi giorni dell'ultimo mese" che servono per completare il tuo calendario.
Anno nuovo, ricominci il conteggio. (O tieni il vecchio e sottrai 365/366)
Guarda questa discussione, potrebbe essere molto simile a quel che cerchi
https://www.gdr-online.com/readforum.asp?id=200619 ↗
19/10/2015 22:50:13
Innanzitutto grazie per aver risposto.
Quel codice a cui mi hai indirizzato non è male in effetti, ha risolto un altro dubbio che avevo. Però quello visualizza solo la data corrente, non genera un vero e proprio calendario. Il codice che avevo trovato io online è questo:
<?php
//Trovo i dati fondamentali:
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
$dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
$dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
$dati['anno'] = date("Y", time()); // Anno
$dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno'])); // Giorno della settimana del primo giorno dell'anno
$dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28; // Calcolo dei giorni di febbraio
$dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente
$dati['settimane_mese'] = ceil($dati['giorni_mese']/7); // Settimane del mese corrente arrotondato per eccesso.
//
// Vi sarete accorti che:
// 1) Nel calcolo dei giorni del mese corrente c'è un -1: Questo è perchè l'array inizia da 0, non da 1
// 2) Ho arrotondato per eccesso il calcolo delle settimane: Per evitare giorni nascosti nell'ultima settimana
// 3) I giorni della settimana trovati da date() iniziano da 0 ( Domenica ) fino a 6 ( Sabato )
//
$info['can_start'] = FALSE; // Se il conteggio reale dei giorni può partire
$info['to_less'] = 0; // Giorni da accumulare
$text = '<div align="center">'.$dati['mese_text'].'</div>'.
'<table align="center">
<tr>
<td class="cal_days">LU</td>
<td class="cal_days">MA</td>
<td class="cal_days">ME</td>
<td class="cal_days">GI</td>
<td class="cal_days">VE</td>
<td class="cal_days">SA</td>
<td class="cal_days">DO</td>
</tr>'; // Schema fisso dei giorni della settimana
//
// Ciclo madre: Continua per tutte le settimane del mese
//
for($ciclo = 0; $ciclo <= $dati['settimane_mese']; $ciclo++)
{
$text .= '<tr>'; // Aggiungo una griglia
//
// Ciclo Figlio ( SubCiclo ): Avanza per tutti i giorni della settimana
//
for($subciclo = 1; $subciclo <= 7; $subciclo++)
{
//
// Controllo se il ciclo può partire e se il giorno del ciclo figlio
// corrisponde a quello della settimana del primo giorno del mese
//
if($subciclo != $dati['start'] && $info['can_start'] == FALSE)
{
//
// Se tutti e due sono FALSE:
//
$text .= '<td class="cal_day"></td>'; // 1) Aggiungo una casella vuota
$info['to_less']++; // 2) Aggiungo un giorno da levare
continue; // 3) Faccio ricominciare il ciclo finchè uno dei due casi si riveli TRUE
}
else
{
$info['can_start'] = TRUE; // Muto il valore di can_start in TRUE
}
//
// Naturalmente solo uno dei due casi può rivelarsi TRUE: Solo ' $subciclo != $dati['start'] '
// dato che can_start diverrà TRUE solo quando si avvererà la prima condizione. Così il conto può partire
//
// Ora mi calcolo il giorno corrente, Sommando il valore corrente della variabile di questo ciclo ai giorni
// delle settimane trascorse ( Grazie alla moltiplizacione per 7 di $ciclo ) e levando infine i giorni
// accumulati in precedenza. Vi ricordo che questo di seguito è la variabile contenente il giorno da mostrare,
// non quello di oggi
$dati['current_day'] = $subciclo+($ciclo*7)-$info['to_less']; // Calcolo il giorno da mostrare
//
// Controllo ci restano ancora giorni del mese
//
if($dati['current_day'] <= $dati['giorni_mese'])
{
//
// Se si...
//
// Vorrete fare capire il giorno di oggi, no? Quindi cambiamo stile
// alla cella in caso questa corrisponda a quella di oggi.
//
if($dati['current_day'] == $dati['oggi']) // Controllo se il giorno da mostrare è quello di oggi
{
$tdclass = 'oggi'; // Cambio stile in 'oggi' se è oggi
} else {
$tdclass = 'default'; // Cambio stile in 'Default' se non è oggi
}
$text .= '<td class="'.$tdclass.'">'.$dati['current_day'].'</td>'; // Poi aggiungo la cella
} else {
//
// Se invece non ci restano più giorni del mese, faccio terminare il ciclo
//
break;
}
//
// Finisce qui il SubCiclo, se ci sono ancora settimane da mostrare il ciclo continuerà, se no, si fermerà.
//
}
$text .= '</tr>'; // Chiudo la griglia
}
$text .= '</table>'; // Chiudo la tabella
echo $text;
?>
e per il ciclo for usa la variabile
$dati['settimane_mese']
che è così definita
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['giorni_mese'] = $dati['giorni_mesi'][$dati['mese_num']-1]; // Giorni del mese corrente
$dati['settimane_mese'] = ceil($dati['giorni_mese']/7); // Settimane del mese corrente arrotondato per eccesso.
e questo codice mi genera appunto il calendario di questo mese. io vorrei fare una cosa del genere.
20/10/2015 09:45:48
Se ti serve in questo formato devi prima stabilire alcune regole.
Tu vuoi un calendario da 16 mesi, ma il codice che hai postato ovviamente si riferisce al vero calendario, quindi
$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
Queste due vanno sostituite con funzioni che fittiziamente calcolino il "mese immaginario corrente".
Più in generale, per farlo funzionare devi lavorare solo con queste variabili qua:
$dati['giorni_mesi'] = array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // Array con i giorni dei mesi
$dati['mese_num'] = date("n", time()); // Mese corrente ( numerico )
$dati['mese_text'] = date("F", time()); // Mese Corrente ( testuale )
$dati['oggi'] = date("j", time()); // Oggi ( numerico senza eventuali zeri )
$dati['oggi_sett'] = date("w", time()); // Oggi ( nella settimana, numerico )
$dati['anno'] = date("Y", time()); // Anno
$dati['start'] = date("w", mktime(0,0,0, $dati['mese_num'], 1, $dati['anno'])); // Giorno della settimana del primo giorno dell'anno
$dati['giorni_mesi'][1] = (($dati['mese_num']%400) == 0) ? 29 : 28; // Calcolo dei giorni di febbraio
e devi sostituire tutti i richiami alla funzione date() con una funzione (meglio un oggetto) che restituisca la stessa cosa, ma nel tuo calendario.
Se in giornata trovo un secondo provo a scriverlo
21/10/2015 12:29:44
Infatti avevo iniziato a modificare quella parte del codice modificando il contenuto dell'array e altre cose, come ho scritto nel post iniziale. Il mio problema è che non so come modificare il resto.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
RAID Shadow Legends ↗
State of Survival ↗
War Thunder ↗
Raja Dunia ↗