Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 25 su 25
  1. #21
    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?

  2. #22
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    ...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?

    Sì. Corretto.

    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    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.

    Come già detto, io non ho quella libreria e non l'ho mai usata. Però, dovresti far vedere esattamente il codice completo che hai usato ed esattamente i dati relativi alle due ore (comprensivi di secondi e millisecondi: fattele stampare a video perchè "11/11/2011 00:00" non è un orario completo, mancano sia i secondi che i millisecondi), perchè la mezzanotte è un orario piuttosto particolare e se anche ci sono dei millisecondi tutto salta. Bisogna capire se devi considerare i secondi ed i millisecondi oppure no.


    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    Ho anche inserito un ciclo for me sommare la diaria su più giorni ma diventa infinito

    codice:
    for(int i = (int) diffDays; i<=diffDays; i++){
    
      if(diff >= (8 * 60 * 60 * 1000)){ //8 ore convertite in millisecondi
         System.out.println("c'è diaria");
        if (gestMissione.verificaQuattroOreNotturne(d_inizio, d_fine)){
              System.out.println("Diaria con pernotto");
         }else{
        System.out.println("Diaria senza pernotto");
        }
    
    }else{
        System.out.println("Niente diaria");
    }
    che sbaglio?
    Sbagli che quel ciclo for non ha alcun senso. La sua variabile "i" parte da diffDays e arriva a diffDays, quindi fa un solo cirlo... perfettamente inutile.

    Come faccio a fare il calcolo su più giorni?

    Devi tenere conto di quanti giorni copre l'intervallo temporale fra le date (non la differenza fra date, l'intervallo temporale!) e ciclare su quel numero di giorni... calcolando di volta in volta la nuova data di partenza. C'è da fare un po' di lavoro.


    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    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?

    Come sopra. Si calcola il numero di giorni dell'intervallo temporale fra le due date e si ripete l'algoritmo ogni volta con una data ricalcolata (basta aggiungere 1 giorno, o 24 ore, all data di partenza ad ogni ciclo).


    Ciao.
    Ultima modifica di LeleFT; 19-03-2015 a 10:10
    "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

  3. #23
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Come già detto, io non ho quella libreria e non l'ho mai usata. Però, dovresti far vedere esattamente il codice completo che hai usato ed esattamente i dati relativi alle due ore (comprensivi di secondi e millisecondi: fattele stampare a video perchè "11/11/2011 00:00" non è un orario completo, mancano sia i secondi che i millisecondi), perchè la mezzanotte è un orario piuttosto particolare e se anche ci sono dei millisecondi tutto salta. Bisogna capire se devi considerare i secondi ed i millisecondi oppure no.
    I secondi e i millisecondi non interessano per il calcolo, non devo essere così preciso, mi basta che 00:01 sia un orario dopo la mezzanotte, i secondi e i millisecondi li stamperebbe sempre uguali a zero



    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Sbagli che quel ciclo for non ha alcun senso. La sua variabile "i" parte da diffDays e arriva a diffDays, quindi fa un solo cirlo... perfettamente inutile.
    Infatti ho tolto il ciclo for me ne ero accorto da solo


    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Devi tenere conto di quanti giorni copre l'intervallo temporale fra le date (non la differenza fra date, l'intervallo temporale!) e ciclare su quel numero di giorni... calcolando di volta in volta la nuova data di partenza. C'è da fare un po' di lavoro.



    Come sopra. Si calcola il numero di giorni dell'intervallo temporale fra le due date e si ripete l'algoritmo ogni volta con una data ricalcolata (basta aggiungere 1 giorno, o 24 ore, all data di partenza ad ogni ciclo).
    Avevo pensato di ragionare sulla falsa riga del codice che mi hai scritto prima
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    codice:
    privateboolean verificaQuattroOreNotturne(Date inizio,Date fine){
    nel senso di fare un intersezione di intervalli giorno per giorno. Mi spiego meglio: la funzione ha in ingresso due Date, fa un intersezione di intervalli giorno per giorno, se gli intervalli cadono tra le 22 e le 7 del mattino con almeno 4 ore di lavoro diaria notturna altrimenti diaria diurna.
    Qua sorge il problema come faccio a dare in uscita due valori per esempio che ci sono 2 giorni di diaria notturna e 1 di diaria diurna?


    Ciao.

  4. #24
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da thenightflyer17 Visualizza il messaggio
    I secondi e i millisecondi non interessano per il calcolo, non devo essere così preciso, mi basta che 00:01 sia un orario dopo la mezzanotte, i secondi e i millisecondi li stamperebbe sempre uguali a zero
    Quindi, per prima cosa va modificata la funzione di verifica della mezzanotte (visto che nella mia i secondi e i millisecondi erano considerati)

    codice:
    // Verifica se la data passata corrisponde alla mezzanotte
    private boolean mezzanotte(Calendar c) {
       int calc = c.get(Calendar.HOUR) + c.get(Calendar.MINUTE);
       return (calc == 0);
    }

    Avevo pensato di ragionare sulla falsa riga del codice che mi hai scritto prima

    nel senso di fare un intersezione di intervalli giorno per giorno. Mi spiego meglio: la funzione ha in ingresso due Date, fa un intersezione di intervalli giorno per giorno, se gli intervalli cadono tra le 22 e le 7 del mattino con almeno 4 ore di lavoro diaria notturna altrimenti diaria diurna.
    Qua sorge il problema come faccio a dare in uscita due valori per esempio che ci sono 2 giorni di diaria notturna e 1 di diaria diurna?

    No, va fatto un discorso diverso. Devi sempre considerare l'intervallo della notturna dalle 22:00 del giorno di partenza alle 04:00 (o 07:00 ora non ho capito quale dei due orari, vedi tu) del giorno dopo, ma lo devi fare per ciascun giorno che va dalla data di inizio alla data di fine.

    Quindi, ricapitolando:
    Mantenendo inalterato il codice della funzione "verificaQuattroOreNotturne" (vedi tu se aggiustare l'intervallo orario, io avevo considerato fino alle 04:00, poi tu hai detto che era fino alle 07:00... questo vedilo tu), modificando la funzione "mezzanotte" come sopra, quello che dovrai fare è qualcosa del genere:

    codice:
    Date dataInizio = ...;   // Data/ora inizio lavoro
    Date dataFine = ...;   // Data/ora fine lavoro
    
    long diff = dataFine.getTime() - dataInizio.getTime();
    
    if (diff >= 8 * 60 * 60 * 1000) {   // Ha lavorato almeno 8 ore
       while( dataInizio.before(dataFine) ) {  // Ciclo finchè la dataInizio è antecedente la data di fine
          if ( verificaQuattroOreNotturne(dataInizio, dataFine) ) {
             // Ha fatto almeno 4 ore notturne nel i-esimo giorno
             ...   // fai le tue considerazioni
          }
          ...   // Eventuali altre tue considerazioni su diarie diurne
    
          // Ora verifico nel giorno successivo
          GregorianCalendar gc = new GregorianCalendar();
          gc.setTime( dataInizio );
          gc.add(Calendar.DATE, 1);   // Sposto avanti di un giorno intero (24 ore) la data inizio
          dataInizio = gc.getTime();  // Ora considero come data inizio la data del giorno successivo
       }
    }

    Ciao.
    Ultima modifica di LeleFT; 19-03-2015 a 13:51
    "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

  5. #25
    Prima di tutto vorrei farti i miei comprimenti, sei bravo e poi scusarmi se insisto ma sto veramente da giorni...

    Il codice sottostante non ho ben capito cosa fa.
    codice:
    // Verifica se la data passata corrisponde alla mezzanotte
    private boolean mezzanotte(Calendar c) {
         int calc = c.get(Calendar.HOUR) + c.get(Calendar.MINUTE);
         System.out.println("MEZZANOTTE: "+calc);
    // + c.get(Calendar.SECOND) + c.get(Calendar.MILLISECOND)
           return (calc == 0);
    }
    Se volessi modificare questa funzione per verificare se sono le 13:00?
    Si potrebbe utilizzare la stessa filosofia della mezzanotte?

    Le 13:00 sono un orario giusto al centro della diaria giornaliera compresa tra le 7:00 e le 22:00, in ogni caso potrei inserire un if:

    codice:
    if(gestMissione.verificaOttoOreDiurne(d_inizio, d_fine))

    in modo da utilizzare una funzione simile a quella postata prima.

    Grazie
    Ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.