Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [JAVA - Eclipse] - Joda Time - intervallo

    Ragazzi,
    spero qualcuno possa aiutarmi, devo sviluppare un algoritmo che mi controlli se un intervallo di date cade tra le 22 e le 4 del giorno successivo, come libreria ho usato joda time.

    Nello specifico devo calcolare una diaria che si ottiene facendo più di 8 ore di lavoro, però, di queste 8 ore se almeno 4 cadono tra le 22 e le 4 del giorno successivo si ha una diaria maggiorata perché sono considerate ore notturne.

    Spero di essere stato chiaro, ma per ogni chiarimento basta chiedere.

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ti dico come lo farei io senza l'uso di librerie esterne

    codice:
    // Imposto l'orario minimo: ore 22:00:00 di oggi
    GregorianCalendar oraMin = new GregorianCalendar();
    oraMin.set(Calendar.HOUR_OF_DAY, 22);
    oraMin.set(Calendar.MINUTE, 0);
    oraMin.set(Calendar.SECOND, 0);
    long millisMin = oraMin.getTime().getTime();
    
    // Imposto l'orario massimo: ore 04:00:00 di domani
    oraMin.add(Calendar.HOUR, 6);   // Aggiungo 6 ore all'ora minima
    long millisMax = oraMin.getTime().getTime();
    
    // Verifico se una determinata data/ora ricade nell'intervallo
    Date dataDaVerificare = ...;
    long millis = dataDaVerificare.getTime();
    
    if ((millisMin <= millis) && (millis <= millisMax)) {
       // Sì, l'ora è fra le 22:00 e le 04: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

  3. #3
    Ottima soluzione, ma nel caso il calcolo dovesse essere fatto su più giorni funziona uguale?
    Tipo se si deve calcolare una diaria su più giorni...

    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io ho supposto che a te interessasse il calcolo nel giorno odierno (ovvero dalle 22:00 di oggi alle 04:00 di domani).
    Se la necessità riguarda date in giorni diversi, il codice va modificato con una logica diversa: si deve tener conto solo dell'ora ed effettuare il controllo su due intervalli diversi: dalle 22:00 alle 23:59 e dalle 00:00 alle 04:00.

    La via più semplice è usare il confronto fra le stringhe (trattandosi di orari, va benissimo il confronto lessicografico):

    codice:
          Date dataDaVerificare = ...;
          SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
          String strDt = sdf.format( dataDaVerificare );
          if ((("220000".compareTo(strDt) <= 0) && (strDt.compareTo("235959") <= 0)) ||
              (("000000".compareTo(strDt) <= 0) && (strDt.compareTo("040000") <= 0))) {
    
             // Sì, è nell'intervallo
          }

    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

  5. #5
    Sto sbattendo la testa da giorni...Grazie...

    Se considero anche un orario di fine devo verificare se ci sono almeno 4 ore... la verifica si può fare anche sui millisecondi?

    Nel caso si verifica che sono 4 faccio un ulteriore passo...verifico se ci sono almeno 8 ore per pagare una diaria.

    codice:
    Date d1 = null;
    codice:
    Date d2 = null;
    
    d1 = sdf.parse(d);
    d2 = sdf.parse(f);
    
    //in milliseconds
    long diff = d2.getTime() - d1.getTime();
    
    if(diff >= 14400000){
       //14400000 sono proprio 4 ore
       if(diff >= 28800000){
       //28800000 sono proprio 8 ore pago daria notturna
       }
    
    }
    
    

  6. #6
    Mi spiego meglio...

    In pratica per guadagnare una diaria l'intervallo deve essere sempre di minimo 8 ore di lavoro ma nel caso in cui 4 di queste 8 ore ricadono tra le 22 e le 4 del mattino la diaria è maggiorata perché notturna.

    Spero di essere stato chiaro.

    AIUTO sto impazzendo.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Beh, prima controllerai che vi siano effettivamente 8 ore. Altrimenti non se ne fa nulla.
    Se le 8 ore ci sono, controllerai l'altro intervallo per le notturne.


    codice:
    Date d1 = ...;
    Date d2 = ...;
    
    // Suppongo che d1 sia l'orario di inizio e d2 quello di fine
    long diff = d2.getTime() - d1.getTime();   // differenza in millisecondi
    if (diff >= (8 * 60 * 60 * 1000)) {
       // Ok, sono almeno 8 ore
       // Faccio il controllo sulle notturne, come da precedente post
       // (immagino che il controllo dovrai farlo su d2)
       ...
    }

    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

  8. #8
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Beh, prima controllerai che vi siano effettivamente 8 ore. Altrimenti non se ne fa nulla.
    Se le 8 ore ci sono, controllerai l'altro intervallo per le notturne.


    codice:
    Date d1 = ...;
    Date d2 = ...;
    
    // Suppongo che d1 sia l'orario di inizio e d2 quello di fine
    long diff = d2.getTime() - d1.getTime();   // differenza in millisecondi
    if (diff >= (8 * 60 * 60 * 1000)) {
       // Ok, sono almeno 8 ore
       // Faccio il controllo sulle notturne, come da precedente post
       // (immagino che il controllo dovrai farlo su d2)
       ...
    }

    Ciao.
    Esatto d1 è la data di inizio e d2 quella di fine. Nello specifico come controllo se ci sono 4 ore di lavoro notturno?

    L'avevo pensata così:
    codice:
    if ((millisMin >= millis) && (millis <= millisMax)) {
    // Sì, l'ora è fra le 22:00 e le 04:00
    System.out.println("entra nell'intervallo");
        if(diff >= 4 * 60 * 60 * 1000){
    //almeno 4 ore notturne possiamo passare alla verifica se c'è diaria
        System.out.println("le 4 ore ci sono");
            if(diff >= 8 * 60 * 60 * 1000){
            System.out.println("ci sono anche le 8 ore");
    
            }
        }
    }
    Che ne dici?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    No, per tre ragioni:

    1) Perchè stai continuando ad usare il controllo del mio primo post, che per calcolare millisMin e millisMax considera la data di oggi come partenza (mentre tu hai detto di avere date diverse, su diversi giorni)

    2) Perchè il primo if è sbagliato: millisMin dovrebbe essere MINORE o uguale a millis, non MAGGIORE o uguale.

    3) Il controllo sulle 8 ore lo fai solo dopo quello delle 4 ore (e solo se ci sono le 4 ore notturne), che non mi pare avere alcun senso (ma questo dipende dalla tua logica, che io non conosco).


    Cioè, leggendo i tuoi precedenti post, con quel codice stai facendo tutto il contrario di quello che hai chiesto.


    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

  10. #10
    Hai ragione la logica deve essere invertita ma sto punto e accapo.

    Ho modificato il tuo codice in questo modo:
    codice:
    // Imposto l'orario minimo: ore 22:00:00 di oggi
    GregorianCalendar oraMin = new GregorianCalendar();
    oraMin.set(Calendar.HOUR_OF_DAY, 22);
    oraMin.set(Calendar.MINUTE, 0);
    oraMin.set(Calendar.SECOND, 0);
    long millisMin = oraMin.getTime().getTime();
    
    // Imposto l'orario massimo: ore 04:00:00 di domani
    oraMin.add(Calendar.HOUR, 6);   // Aggiungo 6 ore all'ora minima
    long millisMax = oraMin.getTime().getTime();
    
    // Verifico se una determinata data/ora ricade nell'intervallo
    //Date dataDaVerificare = ...;
    long millis = d2.getTime();
    
    
    if(diff >= (8 * 60 * 60 * 1000)){ //8 ore convertite in millisecondi
    System.out.println("c'è diaria");
    if ((millisMin >= millis) && (millis <= millisMax)){
    // Sì, l'ora è fra le 22:00 e le 04:00
    
        }
    }

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.