Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 24
  1. #11
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da luca200 Visualizza il messaggio
    Io la risposta ve l'ho data nel primo post
    E la risposta che hai dato non c'entra nulla col problema...


    La matematica non è un opinione per nessuno:


    codice:
    LocalDate[] days = new LocalDate[4];
    days[0] = LocalDate.of(2014, 4, 28);
    days[1] = LocalDate.of(2014, 4, 29);
    days[2] = LocalDate.of(2014, 4, 30);
    days[3] = LocalDate.of(2014, 5, 1);
    
    for(int i=0; i<4; i++) {
       printDiff(days[i], LocalDate.of(2015, 2, 1));
    }

    Risultato:


    codice:
    [2014-04-28 , 2015-02-01) = 0 year(s), 9 month(s), 4 day(s)
    [2014-04-29 , 2015-02-01) = 0 year(s), 9 month(s), 3 day(s)
    [2014-04-30 , 2015-02-01) = 0 year(s), 9 month(s), 2 day(s)
    [2014-05-01 , 2015-02-01) = 0 year(s), 9 month(s), 0 day(s)

    Per te è corretto? Per me (e per il resto del mondo, immagino) no.


    PS: ho messo su una VM con Ubuntu e c'ho installato la JDK 8 per fare i test...


    Ciao.
    Ultima modifica di LeleFT; 03-09-2014 a 11:58
    "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. #12
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    E la risposta che hai dato non c'entra nulla col problema...
    Invece la risposta che ho dato E' il problema.

    Facciamo così, diciamo che hai ragione tu. Dal 28/4 al 1/2 secondo te sono 9 mesi e 3 giorni, giusto?

    Bene.
    Adesso dimmi che risultato vi aspettate, tu e il resto del mondo, facendo dal 28/4 al 31/1

  3. #13
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    No, è vero... ha ragione luca200. Il problema è l'unità considerata, ovvero il Periodo (non avevo letto l'ultima frase del tuo primo post)

    Aggiungendo 9 mesi alla data del 30/04/2014 arrivo al 30/01/2015 (mancano 2 giorni al 01/02/2015)
    Aggiungendo sempre 9 mesi alla data del 01/05/2014 arrivo al 01/02/2015. Perchè sto valutando in mesi e non in giorni.

    Perchè il tempo viene espresso in periodi e non in giorni.

    Ok, stavo perdendo di vista l'unità temporale.

    E' sempre la solita questione... se sono alla fine di un mese di 30 giorni e aggiungo un mese, devo arrivare alla fine del mese dopo (31) o al 30 del mese dopo?


    Ciao.
    Ultima modifica di LeleFT; 03-09-2014 a 12:22
    "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. #14
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    No, è vero... ha ragione luca200. Il problema è l'unità considerata, ovvero il Periodo (non avevo letto l'ultima frase del tuo primo post)

    Aggiungendo 9 mesi alla data del 30/04/2014 arrivo al 30/01/2015 (mancano 2 giorni al 01/02/2015)
    Aggiungendo sempre 9 mesi alla data del 01/05/2014 arrivo al 01/02/2015. Perchè sto valutando in mesi e non in giorni.

    Perchè il tempo viene espresso in periodi e non in giorni.

    Ok, stavo perdendo di vista l'unità temporale.



    Ciao.
    ok, anche se fosse così non si spiega perché coi mesi di 31 giorni andando indietro di un giorno non ne portino 2 di differenza (che poi è il reale problema).
    mi spiego.

    1 gennaio 2014 1 febbraio 2014 mi conti un mese (ok).
    31 dicembre 2013 1 febbraio 2014 mi conti un mese e 1 giorno (ok)

    maaaa se prendi il mese di 30, ne metti 2.
    In ogni caso, un bacarazzo da qualche parte è seminato

    edit:

    partiamo dal 30 novembre e aggiungo 2 mesi, siamo al 30 di gennaio, 31 gennaio 1 giorno e 1 febbraio non incluso, quindi 2 mesi e 1 giorno, non mi torna sempre il secondo giorno

    a meno che non si considerino di default tutti i mesi di 30, quindi essendoci il 31 di mezzo debba mettere un giorno in più
    Ultima modifica di valia; 03-09-2014 a 12:31
    RTFM Read That F*** Manual!!!

  5. #15
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok ma prendiamo dal mio [2012-11-30 , 2014-02-01)

    In modo empirico ma comunque credo logico (niente "calcoli" matematici particolari):
    - c'è tutto il 2013 in mezzo: 1 year
    - c'è tutto il Gennaio 2014: 1 month
    - c'è tutto il Dicembre 2012: +1 month
    - c'è il 30 Novembre 2012 (che è incluso!): 1 day

    Mentre stampa: 1 year(s), 2 month(s), 2 day(s)

    È sbagliato il mio ragionamento?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #16
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da valia Visualizza il messaggio
    ok, anche se fosse così non si spiega perché coi mesi di 31 giorni andando indietro di un giorno non ne portino 2 di differenza (che poi è il reale problema).
    mi spiego.

    1 gennaio 2014 1 febbraio 2014 mi conti un mese (ok).
    31 dicembre 2013 1 febbraio 2014 mi conti un mese e 1 giorno (ok)

    maaaa se prendi il mese di 30, ne metti 2.
    In ogni caso, un bacarazzo da qualche parte è seminato

    edit:

    partiamo dal 30 novembre e aggiungo 2 mesi, siamo al 30 di gennaio, 31 gennaio 1 giorno e 1 febbraio non incluso, quindi 2 mesi e 1 giorno, non mi torna sempre il secondo giorno

    Il problema è che si sta ragionando a periodi e non a giorni: fai questa prova:


    codice:
          LocalDate gennaio = LocalDate.of(2014, 1, 31);
          LocalDate marzo = LocalDate.of(2014, 3, 31);
    
          // Aggiungo un mese ad entrambe le date
          LocalDate d1 = gennaio.plus(1, ChronoUnit.valueOf("MONTHS"));
          LocalDate d2 = marzo.plus(1, ChronoUnit.valueOf("MONTHS"));
          System.out.format("%s + 1 MESE -> %s%n", gennaio, d1);
          System.out.format("%s + 1 MESE -> %s%n", marzo, d2);

    Ecco il risultato (come atteso):


    codice:
    2014-01-31 + 1 MESE -> 2014-02-28
    2014-03-31 + 1 MESE -> 2014-04-30

    Il risultato è corretto, ma nel primo caso ha aggiunto 28 giorni (è andato dalla fine del mese di gennaio alla fine del mese di febbraio), nel secondo ne ha aggiunti 30 (è andato dalla fine di marzo alla fine di aprile... eppure l'operazione è la stessa: ho aggiunto 1 mese = sto ragionando a mesi (periodi) non a giorni. I mesi hanno peso (in giorni) diverso a seconda del periodo.

    Di conseguenza: dal 01/05/2014 al 01/02/2015 ci sono 9 mesi esatti (dal primo giorno di un mese al primo giorno di un altro mese), mentre dal 30/04/2014 al 01/02/2015 ci sono 9 mesi e 2 giorni... perchè aggiungendo 9 mesi cado al 30 gennaio 2015 (per l'annosa questione che aggiungendo 1 mese alla fine di un mese di 30 giorni cado al 30 del mese dopo e non al 31) e mi rimangono altri 2 giorni per arrivare al 1 febbraio.


    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

  7. #17
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok ma prendiamo dal mio [2012-11-30 , 2014-02-01)

    In modo empirico ma comunque credo logico (niente "calcoli" matematici particolari):
    - c'è tutto il 2013 in mezzo: 1 year
    - c'è tutto il Gennaio 2014: 1 month
    - c'è tutto il Dicembre 2012: +1 month
    - c'è il 30 Novembre 2012 (che è incluso!): 1 day

    Mentre stampa: 1 year(s), 2 month(s), 2 day(s)

    È sbagliato il mio ragionamento?

    Ni... partendo dal 30/11/2012 aggiungi 1 anno.
    Arrivi al 30/11/2013. Aggiungi 2 mesi (MESI!!), arrivi al 30 gennaio 2014 (sempre per l'annoso problema dell'aggiunta di 1 mese alla data di fine di un mese di 30 giorni....) e mancano ancora 2 giorni per arrivare al 1 febbraio.


    codice:
    LocalDate data = LocalDate.of(2014, 11, 30);
    
    // Aggiungo 2 mesi
    LocalDate d1 = data.plus(2, ChronoUnit.valueOf("MONTHS"));
    System.out.format("%s + 1 MESE -> %s%n", data, d1);

    Stampa 30 gennaio.


    Il problema è questa affermazione:

    - c'è tutto il Gennaio 2014: 1 month

    In realtà non considera "tutto gennaio", ma gennaio fino al 30 (perchè parte da una data posizionata alla fine di un mese di 30 giorni).


    Ciao.
    Ultima modifica di LeleFT; 03-09-2014 a 12:48
    "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. #18
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Spet, ma se tu hai questo


    Returns a copy of this
    LocalDate with the specified period in months added.This method adds the specified amount to the months field in three steps:

    1. Add the input months to the month-of-year field
    2. Check if the resulting date would be invalid
    3. Adjust the day-of-month to the last valid day if necessary

    For example, 2007-03-31 plus one month would result in the invalid date 2007-04-31. Instead of returning an invalid result, the last valid day of the month, 2007-04-30, is selected instead.
    This instance is immutable and unaffected by this method call.
    Parameters:monthsToAdd the months to add, may be negativeReturns:a LocalDate based on this date with the months added, not nullThrows:DateTimeException if the result exceeds the supported date range
    per il metodo
    codice:
    public LocalDate plusMonths(long monthsToAdd) 
    
    


    hai aggiunto il periodo di un mese, mi aspetto che sia il 31, non il 28.
    Da qualche parte i conti non tornano (mi attengo a quello che scrivono anche come codice e documentazione)

    come nel caso di 31 marzo mi porta al 30 di aprile (corretto), mi aspetto che dal 30 di aprile mi porti al 31 di maggio, visto che aggiungo il periodo completo.
    Ultima modifica di valia; 03-09-2014 a 12:51
    RTFM Read That F*** Manual!!!

  9. #19
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Attenzione che il procedimento descritto è corretto, ovvero accade proprio questo. Partiamo dal 28 febbraio:

    1. Add the input months to the month-of-year field

    Ottengo il 28 marzo (ha solo aggiuno 1 al mese, il giorno non l'ha toccato)

    2. Check if the resulting date would be invalid

    28 marzo è una data valida

    3. Adjust the day-of-month to the last valid day if necessary

    Non viene fatto alcun aggiustamento. E ottengo il 28 marzo.


    Stesso procedimento se parto dal 30 di novembre... aggiungo 2 mesi e arrivo al 30 gennaio dell'anno successivo. Data valida, nessun aggiustamento.


    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. #20
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    non partiamo da implementazioni, parti da ragionamenti: aggiungere il periodo di un mese al 30 di novembre, vuole dire 30 dicembre o 31 dicembre? perché aggiungere 1 periodo al 31 di luglio di porta al 31 di agosto e il periodo è sempre 1....è lì l'inghippo
    RTFM Read That F*** Manual!!!

Tag per questa discussione

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.