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?
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?
Sì. Corretto.
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.
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.
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
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
Infatti ho tolto il ciclo for me ne ero accorto da solo
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?
Ciao.![]()
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
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.
Se volessi modificare questa funzione per verificare se sono le 13:00?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); }
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