Newsgroup: it.comp.lang.perl
Titolo: creare calendario

salve,
     come posso creare un calendario? mi spiego, prendendo il timestamp 
di adesso ho bisogno di creare ad esempio un array assiociativo con 
tutti i giorni ed i loro nomi del mese corrente...(magari divisso in 
settimane)
Immagino che per rappresentare i giorni seguenti ad oggi dovro 
aggiungere di volta in volta il numero di secondi che rappresentano un 
giorno; e per rappresentare i giorni precedenti ad oggi dovrò togliere 
il numero di secondi che rappresentano un giorno:
my ($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time + 
????))[0,1,2,3,4,5,6];
quindi se oggi il mese è 10 continuo il ciclo finche mese rimane 10
potreste dirmi quanti secondi rappresentano un giorno, settimana e mese?
tutto questo mi serve per reare un agenda
grazie
-- 
Alla batteria dai retta, ballA!

 grazie
ho ancora una domanda...la settimana inizia da lunedi giusto? allora che 
ottobre e partito da sabato?
ho dei problemi di comprensione del calendario e di come strutturarlo.
se ho il timestamp di adesso e voglio prendere la settimana corrente 
partendo dal lunedi, come devo fare? oggi e mercoledi, ed io vorrei 
iniziare dal lunedi fino a domenica.


 il numero di secondi che rappresentano un giorno:
Date::Calc::Iterator.
E, visto che l'appetito vien mangiando, Date::Manip. Ecco un 
piccolo esempio, che avevo usato per proporre un calendario 
di birrate per il GardaLUG che fosse facile da ricordare:
    --------------------------------------------------------------
    use strict;
    use warnings;
 
    use Date::Manip;
    print "GardaLUG Meeting:\n";
    my @dates = ParseRecur( "2nd friday of every month in 2005" );
    foreach my $d (@dates) {
            print UnixDate($d, "\t%b %e, %Y\n"); 
    }
    --------------------------------------------------------------
La documentazione naturalmente la trovi su 
search.cpan.org
.
ciao,
S.
-- 
Stefano Rodighiero      |  
http://larsen.perlmonk.org/blog
mailto:
lar...@perl.it
   |  Italian Perl Mongers: 
http://www.perl.it

 E, visto che l'appetito vien mangiando, Date::Manip.
hai postato moduli meravigliosi ma purtroppo non posso installarli...
Io volevo fare la cosa da solo ma mi serviva un piccolo spinta...
ciao


 hai postato moduli meravigliosi ma purtroppo non posso installarli...
# Calendar/Simple.pm did not return a true value.
File 'Macintosh HD:Utenti:Claudio:Desktop Folder:nuova 
cartella:
ciao.pl
'; Line 3
# BEGIN failed--compilation aborted.
File 'Macintosh HD:Utenti:Claudio:Desktop Folder:nuova 
cartella:
ciao.pl
'; Line 3


 cartella:
ciao.pl
'; Line 3
A giudicare da come viene scritto il path sei in ambiente
Mac OS Classic. A giudicare invece da *cosa* c'e` scritto
sei in ambiente Mac OS X. Potresti darmi qualche maggiore
dettaglio? 
Secondo me conviene risolvere il problema che ti impedisce 
di installare i moduli che ti servono: tale problema lo 
risolveresti una volta per tutte (beh, se non per tutte 
almeno per molte), anziche` dover di volta in  volta riscrivere 
codice che esiste gia` (ma in questo caso i moduli ti possono 
essere utili lo stesso, contenendo codice gia` testato e 
funzionante).


Io volevo fare la cosa da solo ma mi serviva un piccolo spinta...
Per creare un calendario da zero, partendo da localtime e timestamp, non ti
serve una piccola spinta, ti serve un rimorchiatore.
E' più complicato di quanto possa sembrare, in particolare non basta
aggiungere il numero di secondi corrispondente ad un giorno (che, ad ogni
buon conto, non è così difficile calcolare: 24*60*60, salvo i giorni con un
secondo in più). In questo modo localtime può dare risultati diversi da
quelli che ci si attende.
Se guardi uno dei moduli per la generazione di calendari, può renderti
conto delle precauzioni che è necessario prendere, e della relativa
complessità. Evidentemente, nulla che non si possa fare, anzi rifare, ma
val la pena chiedersi bene prima se è proprio necessario.
Ciao

 serve una piccola spinta, ti serve un rimorchiatore.
guarda, per adesso già sapere come ricavare il lunedi della settimana 
partendo dal giorno odierno sarebbe un gran passo avanti...
grazie


partendo dal giorno odierno sarebbe un gran passo avanti...
Trenta giorni ha novembre, con april, giugno e settembre, di ventotto
ce n'è uno (tranne negli anni divisibili per quattro, a parte, per gli
anni posteriori al 1582, gli anni zero del secolo se non sono
divisibili per quattrocento, in cui ne ha ventinove), tutti gli altri
ne han trentuno (a parte l'ottobre del 1582, che ne ha avuti ventuno).
Questo è tutto quello che ti serve per costruire un calendario
perpetuo (perpetuo, insomma... valido entro un arco di tempo
probabilmente più ampio di quello che ti serve).
In particolare, trovare il lunedì della settimana attuale sembra
abbastanza banale: (localtime(time))[6] ti da il giorno della
settimana (che, per localtime, inizia da domenica).
Da lì sai quanti giorni devi andare indietro per trovare lunedì
(((localtime(time))[6]+6)%7). (localtime(time))[3] ti dice il giorno
dal mese da cui partire, che confrontato con il valore precedente ti
dice se la tua settimana sta tutta nel mese o a cavallo fra due.
Se la settimana è cavallo fra due mesi, la filastrocca ti dice qual'è
l'ultimo giorno del mese precedente. Nel caso il mese sia gennaio,
dovrai eventualmente anche scalare di uno l'anno.
Noioso, ma non particolarmente complicato, né dispendioso come
calcolo.
In rete comunque potrai trovare centinaia di algoritmi per il calcolo
di date. In particolare, potresti trovare utili gli algoritmi per
calcolare il giorno giuliano partendo dalla data, e la data partendo
dal giorno giuliano.
Ciao.

 dovrai eventualmente anche scalare di uno l'anno.
sto provando adesso questo codice:
#!/perl
$weekday = (((localtime(time))[6]+6)%7);
my @days   = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
print $days[$weekday];
mi dice "Thu"
cosa c'č che non va? perchč non mi dice "Mon"?
grazie mille


cosa c'è che non va? perchè non mi dice "Mon"?
La mia spiegazione è stata probabilmente un po' confusa:
(((localtime(time))[6]+6)%7) non restituisce lunedì (che senso avrebbe, del
resto, usare una funzione per farsi restituire sempre 0?), ma il numero di
giorni che devi sottrarre ad oggi per trovare il lunedì della settimana
corrente.
Infatti, oggi venerdì 21 ottobre 2005 la funzione restituisce 4, 21 - 4 =
17, e il 17 ottobre era per l'appunto lunedì.
O non ho capito io quello che chiedevi?
Ciao.

 17, e il 17 ottobre era per l'appunto lunedì.
grande!
Infatti avevo frainteso...ma ora mi domando se fosse stato il primo 
ottobre (sabato)...come ricavavo il lunedi di quella settimana? (26 
settembre). sarebbe bello se (localtime(time) funzionase al contrario! 
ovvero che gli passo i parametri day month e year e mi ricavasse il 
timestamp...


 timestamp...
 perldoc Time::Local
 

timestamp...
Cosě non č. La funzione inversa, o qualcosa di simile (mktime), esiste per
esempio nel modulo POSIX (giusto per citare un nodulo standard che non
dovresti neppure aver bisogno di installare).
Perň č un giro contorto per fare una cosa che č piů semplice fare con un
paio di istruzioni condizionali. Piů interessante puň essere, ripeto, il
calcolo del giorno giuliano.
Ciao.

 5 giorni da sottrarre, 1-5=-4, "trenta giorni ha settembre"->30-4=26).
ok, grazie mille!


 
Ciao,
non so se il calendario che serve a te sta nella presentazione o nella parte di
controllo della tua applicazione, ma nel primo caso ti consiglio di dare
un'occhiata a quest'oggetto:
 
http://www.dynarch.com/projects/calendar
E' un componente JS realmente cross-browser per il rendering di un calendario
con tantissime customizzazioni (più o meno quelle che hai detto) e supporto
AJAX. IMHO, per la presentazione è molto meglio utilizzare componenti
client-side che serve-side, sempre che questo sia compatibile con le esigenze
applicative.
Posto anche l'url di un brevissimo how-to fatto in merito ad una patch che
permette la selezione di date multiple:
 
http://www.modperl.it/articles/jscalendar/
Poiché non sembri un post troppo OT, sto tra l'altro scrivendo un wrapper Perl
per facilitare la creazione del relativo JS necessario all'inizializzazione.
Forse prima o poi su CPAN... ;-)
by
	- Enrico
--- have fun with 
www.perl.it
 ---