Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25

Hybrid View

  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    E io continuo a domandarmi perchè continui ad usare il codice del mio primo post che abbiamo appurato non andare bene per date diverse. Il codice da usare al suo posto è quello del secondo post.

    Mi avevi chiesto

    nel caso il calcolo dovesse essere fatto su più giorni funziona uguale?

    Ed io ti ho risposto di no, che in quel caso avresti dovuto usare un algoritmo diverso... e te l'ho postato.

    Ora mi domando, hai date su giorni diversi (cioè, devi effettuare il controllo su un set di date che può variare anche di molti giorni) o devi sempre partire a considerare come notturna dalle 22:00 di oggi, alle 04:00 di domani (dove per OGGI intendo sempre la data odierna)?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    E io continuo a domandarmi perchè continui ad usare il codice del mio primo post che abbiamo appurato non andare bene per date diverse. Il codice da usare al suo posto è quello del secondo post.

    Mi avevi chiesto




    Ed io ti ho risposto di no, che in quel caso avresti dovuto usare un algoritmo diverso... e te l'ho postato.

    Ora mi domando, hai date su giorni diversi (cioè, devi effettuare il controllo su un set di date che può variare anche di molti giorni) o devi sempre partire a considerare come notturna dalle 22:00 di oggi, alle 04:00 di domani (dove per OGGI intendo sempre la data odierna)?


    Ciao.
    La data di oggi è una data di inizio e può essere anche posteriori alla data odierna, la diaria può essere calcolata anche su un intervallo di più giorni, in effetti se ci sono 8 ore la diaria è € 30 se 4 di queste 8 sono comprese tra le 22 e le 7 (ho sbagliato a dire 4 finora mi sono confuso sorry ma non credo sia un problema) la diaria passa a 100 e così via, ogni giorno passato sono 100 Euro.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    La data di oggi è una data di inizio e può essere anche posteriori alla data odierna
    Nel codice del mio primo post la data di oggi è la data di oggi, non è mai posteriore alla data odierna (che è essa stessa) ed è sempre uguale alla data di oggi.

    Se eseguo quel codice, oggi 18/03/2015 e gli dò in pasto queste date/ore, quel codice ritorna sempre FALSE (nel senso, che non le considera come intervallo notturno):

    19/03/2015 23:00:00
    28/04/2015 02:20:00
    15/01/2015 01:15:00


    E via di seguito per qualunque data che non rientri nell'intervallo [18/03/2015 22:00:00 - 19/03/2015 04:00:00].


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Quindi dici di gestire nel post dove confronti le stringhe?

    Ora è implementato in questo modo:

    codice:
    if(diff >= (8 * 60 * 60 * 1000)){ //8 ore convertite in millisecondiSystem.out.println("c'è diaria");
    // converto l'ora in intero, oraOut è int, nell'if successivo controllo se l'ora di fine è tra 2 e 7
    // per esempio dalle 22 alle 2 sono le prime 4 ore verificate quindi la diaria è notturna
        if (oraOut >= 2 && oraOut <= 7){
    
        System.out.println("Diaria con pernotto");
        }else{
        System.out.println("Diaria senza pernotto");
                            }
    
    }
    
    Dell'implementazione sugli int che ne dici?

  5. #5
    Ho notato un'altra cosa, se una missione comincia 11/11/2011 alle 13:00 e finisce 13/11/2011 alle 21:00 ci sono due giorni con ore notturne e uno senza quindi verranno pagate 2 diarie notturne e una giornaliera.
    Come si può risolvere in questo caso?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Dipende.
    Mi pare di aver capito che tu hai una data/ora di inizio lavoro ed una data/ora di fine lavoro. E' corretto?
    Sempre da quel che ho capito tu devi verificare che il tizio abbia lavorato almeno 8 ore, per avere diritto alla diaria. E' corretto?
    Se ha diritto alla diaria e di queste 8 ore ne ha lavorato almeno 4 tra le 22:00 e le 04:00 allora ha diritto anche alla notturna.
    E' tutto corretto quello che ho capito?


    Ciao.
    Ultima modifica di LeleFT; 18-03-2015 a 14:42
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Dipende.
    Mi pare di aver capito che tu hai una data/ora di inizio lavoro ed una data/ora di fine lavoro. E' corretto?
    Sempre da quel che ho capito tu devi verificare che il tizio abbia lavorato almeno 8 ore, per avere diritto alla diaria. E' corretto?
    Se ha diritto alla diaria e di queste 8 ore ne ha lavorato qualcuna tra le 22:00 e le 04:00 allora ha diritto anche alla notturna.
    E' tutto corretto quello che ho capito?


    Ciao.
    Esattamente come hai detto tu, tranne l'ultima cosa, se di queste ore ne ha lavorato almeno 4 tra le 22 e le 7 ha diritto alla diaria notturna.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Sì, infatti avevo corretto il mio precedente post.
    La questione, quindi, non è così banale come l'avevo capita inizialmente ed, effettivamente, una libreria come Joda Time ritorna utile.
    Premesso che non l'ho mai usata, ho comunque sbirciato la sua documentazione e c'è qualcosa che può facilitarti la vita.

    La parte più spinosa è la questione delle 4 ore nell'intervallo tra le 22:00 e le 04:00.

    Dobbiamo fare delle assunzioni per poter lavorare agevolmente. L'assunzione più "facile" e logica è che una persona non possa lavorare per più di 24 ore consecutivamente... speriamo che sia garantita questa cosa.

    Detto questo, la cosa si risolve abbastanza agevolmente:

    1) Costruiamo un oggetto Interval (della libreria Joda Time) che vada dalle ore 22:00 dello stesso giorno della data inizio lavoro alle ore 04:00 del giorno dopo.

    2) Costruiamo un oggetto Interval che vada dalla data di inizio lavoro alla data di fine lavoro.

    3) Usiamo il metodo overlap() per vedere se c'è una sovrapposizione. Tale metodo ritorna un Interval che rappresenta l'intervallo di sovrapposizione. Se è nullo non c'è sovrapposizione, quindi niente lavoro in orario notturno. Se non è nullo, usiamo il metodo toDuration() per ottenere un oggetto Duration e su questo il metodo getStandardHours() che ci ritorna il numero di ore della durata di questo intervallo.

    Ribadisco che non ho mai usato la libreria Joda Time, quindi questo spezzone di codice non è detto che funzioni:

    codice:
    // Questo metodo ritorna true se nell'intervallo tra "inizio" e "fine"
    // vi sono almeno 4 ore di lavoro notturno
    private boolean verificaQuattroOreNotturne(Date inizio, Date fine) {
       boolean ret = false;
    
       GregorianCalendar gc = new GregorianCalendar();
       gc.setTime( inizio );
    
       // Caso molto particolare: se l'inizio cade a mezzanotte
       // allora ci sono esattamente 4 ore di lavoro notturno
       if ( !mezzanotte(gc) ) {
    
          // Ottengo le ore 22:00 del giorno di inizio
          gc.set(Calendar.HOUR_OF_DAY, 22);
          gc.set(Calendar.MINUTE, 0);
          gc.set(Calendar.SECOND, 0);
          gc.set(Calendar.MILLISECOND, 0);
          long startInterval = gc.getTime().getTime();
    
          // Ottengo le ore 04:00 del giorno successivo a inizio
          gc.add(Calendar.HOUR, 6);
          long endInterval = gc.getTime().getTime();
    
          Interval notturno = new Interval(startInterval, endInterval);
          Interval lavoro = new Interval(inizio.getTime(), fine.getTime();
    
          // Vediamo se i due intervalli si sovrappongono
          Interval sovrapposizione = lavoro.overlap( notturno );
          if (sovrapposizione != null) {
             // C'è sovrapposizione, verifichiamo se ci sono almeno 4 ore
             Duration durata = sovrapposizione.toDuration();
             ret = (durata.getStandardHounrs() >= 4);
          }
    
       }
    
       return ret;
    }
    
    // Verifica se la data passata corrisponde alla mezzanotte
    private boolean mezzanotte(Calendar c) {
       int calc = c.get(Calendar.HOUR) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) + c.get(Calendar.MILLISECOND);
       return (calc == 0);
    }

    Nota: vedi tu se vuoi considerare o meno i millisecondi nel calcolo della mezzanotte... in questo caso un orario del tipo 00:00:00:123 non viene considerata come mezzanotte.

    Nota 2: per verificare se ha lavorato almeno 8 ore, puoi procedere come prima con una banale differenza fra i millisecondi delle due date.


    Ciao.
    Ultima modifica di LeleFT; 18-03-2015 a 16:08
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Provo l'algoritmo e ti dico.

    In ogni caso grazie e sei un genio...

    ...solo una cosa...siccome le ore notturne sono dalle 22 alle 7 se modifico il tuo codice da --> a
    codice:
    gc.add(Calendar.HOUR,6); --> gc.add(Calendar.HOUR,9);
    

    ottengo l'intervallo più grande, giusto?

    P.S. Purtroppo la persona può lavorare più di 24 ore nel senso che se parte per l'estero sono tutte considerate ore consecutive, ne senso che se sono 3 giorni sono 24+24+24 ore ma credo che una soluzione si trovi in un secondo momento.
    Ultima modifica di thenightflyer17; 18-03-2015 a 19:38

  10. #10
    A cavallo di due giorni funziona ma se metto come data e ora di inizio e data e ora di fine rispettivamente (naturalmente la data è indicativa è l'ora che conta in questo caso):

    11/11/2011 00:00
    11/11/2011 08:00

    quindi 8 ore di lavoro con 4 tra le 22 e le 7 del mattino, mi da una diaria senza pernotto ma in questo caso è diaria con pernotto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.