FUNZIONE GIORNO

di il
21 risposte

21 Risposte - Pagina 2

  • Re: FUNZIONE GIORNO

    Toc toc, posso entrare?

    io avrei una soluzione, ma non so se è corretta...
    Ho provato con alcune date e sembra funzionare, ma sono così che praticamente non ho idea di cosa stia facendo...

    Come vi sembra?
    public class Data {
        
        int giorno;
        int mese;
        int anno;
    
        //0 -> lunedì
        int giornoSettimana;
    
        // costruttore
        public Data(int giorno, int mese, int anno, int giornoSettimana) {
            this.giorno = giorno;
            this.mese = mese;
            this.anno = anno;
            this.giornoSettimana = giornoSettimana;
        }
        
    }
    final int GIORNI_MESE[] = {31,28,31,30,31,30,31,31,30,31,30,31};
            
            //che giorno era il 01 gen 1 d.C. ???
            final int PRIMO_GIORNO = 0;
            
            //oggi ( data che voglio esaminare)
            Data data = new Data(1,3,100,-1);  
            
            //giorni trascorsi dal giorno 0
            long giorniTrascorsi = 0;
            int i;
            
            //aggiungo il giorno del mese corrente
            giorniTrascorsi+=(data.giorno-1);
            
            //aggiungo i giorni dei mesi trascorsi completamente in quest'anno
            for(i = 1; i<data.mese; i++){
                giorniTrascorsi+=GIORNI_MESE[i-1];
            }
            
            //aggiungo 365 giorni per ogni anno completamente trascorso
            giorniTrascorsi+=(365*(data.anno-1));
            
            //aggiungo 1 giorno (del mese bisestile) per ogni anno bisestile trascorso ( non è finita qui... )
            giorniTrascorsi+=(data.anno/4);
            
            //gli anni divisibili per 100 non sono bisestili, a parte quelli divisibili anche per 400 ( da Wiki ihihihihi )
            giorniTrascorsi-=(data.anno/100)+(data.anno/400);
            
            //se quest'anno è bisestile ma non è ancora marzo tolgo un giorno
            if(data.mese<3 && (data.anno % 400 == 0 || (data.anno % 100 != 0 && data.anno % 4 == 0))){
                    giorniTrascorsi--;
            }
            
            //mmmmmmm, non te lo apettavi...
            System.out.println("Giorni trascorsi="+giorniTrascorsi);
            
            //che nome ha oggi (wat?)
            data.giornoSettimana = (int) ((giorniTrascorsi+PRIMO_GIORNO)%7);
            
            //finalmente =)
            System.out.println("Oggi è "+ data.giornoSettimana);
    ps: ebbene si, questo antico documento è scritto nell'arcana e proibita lingua consciuta con il nome di... JAVAAAAA

    pps: @Oregon
    nel mio libro di storia c'è scritto che nel 20.000 a.C. gli uomini primitivi ... ecc...
    E, anche se nel 20.000 a.C. non esistevano calendari, i giorni sono del tutto rappresentabili...
  • Re: FUNZIONE GIORNO

    Mi correggo
    final int GIORNI_MESE[] = {31,28,31,30,31,30,31,31,30,31,30,31};
            
            //che giorno era il 01 gen 1 d.C. ???
            final int PRIMO_GIORNO = 5;
            
            //oggi ( data che voglio esaminare)
            Data data = new Data(23,6,2014,1);  
            
            //giorni trascorsi dal giorno 0
            long giorniTrascorsi = 0;
            int i;
            
            //aggiungo il giorno del mese corrente
            giorniTrascorsi+=(data.giorno-1);
            
            //aggiungo i giorni dei mesi trascorsi completamente in quest'anno
            for(i = 1; i<data.mese; i++){
                giorniTrascorsi+=GIORNI_MESE[i-1];
            }
            
            //aggiungo 365 giorni per ogni anno completamente trascorso
            giorniTrascorsi+=(365*(data.anno-1));
            
            //aggiungo 1 giorno (del mese bisestile) per ogni anno bisestile trascorso ( non è finita qui... )
            giorniTrascorsi+=(data.anno/4);
            
            //gli anni divisibili per 100 non sono bisestili, a parte quelli divisibili anche per 400 ( da Wiki ihihihihi )
            giorniTrascorsi-=(data.anno/100)+(data.anno/400);
            
            //se quest'anno è bisestile ma non è ancora marzo tolgo un giorno
            if(data.mese<3 && (data.anno % 400 == 0 || (data.anno % 100 != 0 && data.anno % 4 == 0))){
                    giorniTrascorsi--;
            }
            
            //i 12 giori saltati all'introduzione del calendario
            giorniTrascorsi+=12;
            
            //mmmmmmm, non te lo apettavi...
            System.out.println("Giorni trascorsi="+giorniTrascorsi);
            
            //che nome ha oggi (wat?)
            data.giornoSettimana = (int) ((giorniTrascorsi+PRIMO_GIORNO)%7);
            
            //finalmente =)
            System.out.println("Oggi è "+ data.giornoSettimana);
  • Re: FUNZIONE GIORNO

    Quasi esatto!

    Nel tuo oggetto Data, il giorno della settimana non deve essere passato come argomento, ma calcolato al volo.

    Per il resto, esatto!!!!!!

    Anche se e' un po' trucchettoso il giochino che hai fatto per il calcolo del numero di giorni relativi agli anni bisestili: da un punto di vista di comprensione dell'algoritmo, sarebbe stato meglio separare i calcoli relativi agli anni precedenti da quelli relativi all'anno della data.
    Ma funziona!

    In questo modo potrai sapere il giorno della settimana dall'anno 0 (zero ) a qualunque anno con y>0, anche nell'anno 1.000.000.

    Per gli anni negativi, cioe' precedenti a quello che e' l'anno 0 (o 1) del calendario, c'e' un po' di lavoro da fare per due motivi:

    1) certi calendari non hanno il concetto di anno 0, ma solo di anno 1 o -1
    2) devi tenere conto che la direzione del tempo va da 0 a +infinito, per gli anni positivi, e da -infinito a 0 e non da 0 a -infinito per gli anni negativi.

    Quello che hai fatto e' quello di convertire una data in un giorno universale, fregandotene bellamente del fatto che il calendario gregoriano ha una data di introduzione (e questa sappiamo esattamente a chi e' riferita ).

    Come volevasi dimostrare!

    Ed e' la base delle conversioni tra date:

    data calendario 1 -> giorno universale -> data calendario 2

    Quello che serve e' conoscere la rappresentazione nei due calendari di uno stesso giorno dal punto di vista storico.

    Per esempio per i calendari giuliano e gregoriano hai

    4/10/1582 giuliano -> 14/10/1582 gregoriano

    ed ovviamente

    5/10/1582 giuliano -> 15/10/1582 gregoriano

    Quello che deve succedere e' che convertire in giorno universale la data nei due calendari deve fornire lo stesso numero.


    Se hai tempo e voglia, ci sono 2 cose che potresti fare:

    1) semplificare l'implementazione usando delle tabelline precalcolate per il numero di giorni passati dall'inizio dell'anno (2, una per gli anni normali ed una per quelli bisestili), ed una funzioncina per il calcolo dei giorni passati fino al 1 gennaio dell'anno in questione
    2) implementare l'algoritmo inverso

    giorno universale -> data

    Per questa conversione ci sono diversi approcci possibili.

    Quello che ti consiglio e' il seguente:

    1) dal giorno universale ricavi una prima data approssimata
    2) da questa data approssimata calcoli il nuovo giorno universale,
    3) confronti i due valori e ti sposti di un giorno alla volta in avanti o in dietro (con la data!) fino a che i due valori coincidono.

    Per fare questo ti serve, guarda caso, le tabelline del passo 1)
  • Re: FUNZIONE GIORNO

    oregon ha scritto:


    Non svicolo ... sei tu che non hai le idee chiare sul tuo algoritmo ...
    Visto che non hai ancora fornito un alcunche' di algoritmo implementabile mi sembra evidente chi non ha le idee chiare.
    Ovviamente, l'uso di librerie di terze parti non vale.
    Ma ormai ....
  • Re: FUNZIONE GIORNO

    pps: @Oregon
    nel mio libro di storia c'è scritto che nel 20.000 a.C. gli uomini primitivi ... ecc...
    E, anche se nel 20.000 a.C. non esistevano calendari, i giorni sono del tutto rappresentabili...
    Ho solo detto che il calendario gregoriano è applicabile solo fino ad una certa data non che i giorni "non erano rappresentabili" prima.

    E scusa ale, ma dove è scritto che nel 20000 a.C. sapessero cosa era lunedì o martedì ?
    Si vede chiaramente che non hai capito cosa ho scritto.

    In ogni caso, attendo di sapere che giorno della settimana fosse il 14/10/1582 con il tuo (vostro) algoritmo ...
  • Re: FUNZIONE GIORNO

    migliorabile ha scritto:


    oregon ha scritto:


    Non svicolo ... sei tu che non hai le idee chiare sul tuo algoritmo ...
    Visto che non hai ancora fornito un alcunche' di algoritmo implementabile mi sembra evidente chi non ha le idee chiare.
    Ovviamente, l'uso di librerie di terze parti non vale.
    Ma ormai ....
    A questo punto mi dispiace ma sono certo che non hai capito cosa ho affermato.

    Ma ormai ...
  • Re: FUNZIONE GIORNO

    Grazie a tutti.. proverò a saltarci fuori
Devi accedere o registrarti per scrivere nel forum
21 risposte