Calendario... come crearlo e personalizzarlo??
Calendario... come crearlo e personalizzarlo?? postato il 21/07/2011 12:31:59 nel forum programmazione, open source e hosting
ciao a tutti, ho un problema relativo al calendario per il mio gdr.
Mi era venuta la voglia di creare un calendario di questo tipo:
mesi di 30 giorni, anni di 6 mesi ...
ora però non so proprio da dove partire, mi vengono in mente soluzioni relativamente assurde e non so come affrontare il cruccio "se non mi si collegano utenti, come si aggiorna il calendario" ??
Pagine → 1
21/07/2011 13:45:26 e modificato da blancks il 21/07/2011 13:46:57
E' un semplice problema di matematica.
Usa come riferimento temporale il timestamp:
$ts = time();
Trasformiamolo in giorni, potendo così definire anche la durata degli stessi. Per convenzione facciamo che un giorno duri 24h ( o anche 86400 secondi ):
$days = ceil($ts/86400);
Adesso abbiamo il numero totale di giorni passati, possiamo calcolare quanti mesi son passati_
$months = ceil($days/30);
Quindi arriviamo agli anni:
$years = ceil($months/6); // puoi sommarci un offset qui, volendo
A questo punto abbiamo gli anni che sono aggiornati ad un valore "reale" per il fine del calcolo, possiamo quindi calcolare in che mese dell'anno siamo:
$month_of_year = 6-(($years*6)-$months);
La logica è semplice, ottengo il totale dei mesi che dovrei avere nell'anno corrente ( $years * 6 ) e detraggo il numero effettivo di mesi che sono trascorsi.
Questo mi da i mesi che mi mancano alla fine dell'anno, perciò, per ottenere il mese in cui mi trovo, sottraggo il numero di mesi costituenti un anno alla differenza risultante ( 6 - ( ambaradam ) ).
Passiamo ora a trovarci il giorno del mese:
$day_of_year = 30-(($months_of_year*30)-(180-(($years*180)-$days)));
Cosa ho combinato ? Praticamente ho adottato la stessa logica usata per scovare il mese: mi calcolo il numero di giorni totali che mi risultano fino a quest'anno e sottraggo i giorni effettivamente trascorsi dal timestamp ( ($years*180)-$days ).
Questa che ottengo è una differenza dei giorni che mi mancano alla fine dell'anno, per cui per ottenere il giorno dell'anno ribalto la situazione sottraendo il numero di giorni costituenti un anno: (180-(($years*180)-$days)).
A questo punto torno ad applicare lo stesso ragionamento: calcolo il totale dei giorni che dovrebbero risultarmi col mese corrente e sottraggo il giorno dell'anno trovato prima: (($months_of_year*30)- (ambaradan))
Quel che ottengo è una nuova differenza che mi indica i giorni che mancano alla fine del mese, per cui sottraendo questo valore al numero di giorni costituenti un mese, ottieni il giorno del mese in questione.
L'ho fatto su due piedi, non l'ho testato ma se non ho dimenticato quel po di matematica che conosco dovrebbe funzionare.
Lo script completo risultante dovrebbe essere qualcosa come:
<?php
$ts = time();
$days = ceil($ts/86400);
$months = ceil($days/30);
$years = ceil($months/6);
$months_of_year = 6-(($years*6)-$months);
$day_of_month = 30-(($months_of_year*30)-(180-(($years*180)-$days)));
echo $years, "<br>";
echo $months_of_year, "<br>";
echo $day_of_month;
?>
Fammi sapere come va ;)
ps: puoi piazzare bellamente un offset all'anno e usare gli switch per convertire i numeri in nomi, come ti pare insomma ;-)
21/07/2011 14:38:47
Che poi non ho ben capito l'aggiornamento senza utenti.
E' importante per dei progettatori di sveglie preoccuparsi di che suono farà nel deserto? :P
Come dice blanks, rimpiazzi la funzione time in php e NOW() in mysql con una tua proprietaria e hai fatto :)
21/07/2011 16:29:29
blancks ha scritto:
Lo script completo risultante dovrebbe essere qualcosa come:
<?php
$ts = time();
$days = ceil($ts/86400);
$months = ceil($days/30);
$years = ceil($months/6);
$months_of_year = 6-(($years*6)-$months);
$day_of_month = 30-(($months_of_year*30)-(180-(($years*180)-$days)));
echo $years, "<br>";
echo $months_of_year, "<br>";
echo $day_of_month;
?>
Fammi sapere come va ;)
viene fuori una roba tipo:
giorno 27
mese 2
anno 85
personalmente puntavo ad avere una che partisse da quest'anno, quindi 200 giorni circa dal 1° del 2011 e poi da li iniziasse il conteggio ... dici si possa fare?
21/07/2011 16:40:10 e modificato da blancks il 21/07/2011 16:42:33
Si, è normale perchè lui inizia il conteggio dall'inizio del time, cioè dal 1970.
Essendo un anno (con quella formula) composto da 6 mesi (180giorni) più corto di uno nostro composto da 12 mesi (365giorni) è normale che per lui siano passati 85 anni anzichè 41 (poco più del doppio).
personalmente puntavo ad avere una che partisse da quest'anno, quindi 200 giorni circa dal 1° del 2011 e poi da li iniziasse il conteggio ... dici si possa fare?
Come ti ho detto, basta un offset per l'anno ;p
$years = ceil($months/6) + 1926;
21/07/2011 16:46:17
blancks ha scritto: Si, è normale perchè lui inizia il conteggio dall'inizio del time, cioè dal 1970.
Essendo un anno (con quella formula) composto da 6 mesi (180giorni) più corto di uno nostro composto da 12 mesi (365giorni) è normale che per lui siano passati 85 anni anzichè 41 (poco più del doppio).
[quote]personalmente puntavo ad avere una che partisse da quest'anno, quindi 200 giorni circa dal 1° del 2011 e poi da li iniziasse il conteggio ... dici si possa fare?
Come ti ho detto, basta un offset per l'anno ;p
$years = ceil($months/6) + 1926;
[/quote]questo è il risultato che esce fuori : giorno 27 del -11554° mese del 2011 anno
o_ò mh credo non vada per avere una roba tipo 1 anno 7° mese 20° giorno ... ??
21/07/2011 16:54:01
araim83 ha scritto: [quote]blancks ha scritto: Si, è normale perchè lui inizia il conteggio dall'inizio del time, cioè dal 1970.
Essendo un anno (con quella formula) composto da 6 mesi (180giorni) più corto di uno nostro composto da 12 mesi (365giorni) è normale che per lui siano passati 85 anni anzichè 41 (poco più del doppio).
[quote]personalmente puntavo ad avere una che partisse da quest'anno, quindi 200 giorni circa dal 1° del 2011 e poi da li iniziasse il conteggio ... dici si possa fare?
Come ti ho detto, basta un offset per l'anno ;p
$years = ceil($months/6) + 1926;
[/quote]questo è il risultato che esce fuori : giorno 27 del -11554° mese del 2011 anno
o_ò mh credo non vada per avere una roba tipo 1 anno 7° mese 20° giorno ... ??[/quote]
Ok ho capito male cosa intendevi, pardon.
Devi modificare il time con un riferimento fisso più recente, annulla la modifica che ti ho fatto fare prima.
e fai così:
$ts = time()-strtotime(date('2011-05-01 00:00:00'));
21/07/2011 17:07:42 e modificato da araim83 il 21/07/2011 17:31:43
blancks ha scritto: [quote]araim83 ha scritto: [quote]blancks ha scritto: Si, è normale perchè lui inizia il conteggio dall'inizio del time, cioè dal 1970.
Essendo un anno (con quella formula) composto da 6 mesi (180giorni) più corto di uno nostro composto da 12 mesi (365giorni) è normale che per lui siano passati 85 anni anzichè 41 (poco più del doppio).
[quote]personalmente puntavo ad avere una che partisse da quest'anno, quindi 200 giorni circa dal 1° del 2011 e poi da li iniziasse il conteggio ... dici si possa fare?
Come ti ho detto, basta un offset per l'anno ;p
$years = ceil($months/6) + 1926;
[/quote]questo è il risultato che esce fuori : giorno 27 del -11554° mese del 2011 anno
o_ò mh credo non vada per avere una roba tipo 1 anno 7° mese 20° giorno ... ??[/quote]
Ok ho capito male cosa intendevi, pardon.
Devi modificare il time con un riferimento fisso più recente, annulla la modifica che ti ho fatto fare prima.
e fai così:
$ts = time()-strtotime(date('2011-05-01 00:00:00'));
[/quote]ok per l'anno ci siamo, ho corretto il calcolo dei giorni, arrotondando le ore in eccesso, contava un giorno in più.
GRAZIE ^_^
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!
World of Tanks ↗
Fallen Gods ↗
World of the Sea Battle ↗
Exclusive Villa GdR ↗
RAID Shadow Legends ↗
World of Warship ↗