Java calcolare i giorni in un anno

C’è un metodo nativo classe Java per calcolare quanti giorni sono stati/saranno in un determinato anno? Come in, è stato un Anno bisestile (366 giorni) o di un normale anno (365 giorni)?

O devo scriverlo?

Sto calcolando il numero di giorni tra due date, per esempio, quanti giorni a sinistra fino a che il mio compleanno. Voglio prendere in considerazione il 29 febbraio di un anno Bisestile. Ho fatto tutto tranne che 29.

InformationsquelleAutor jurchiks | 2011-01-24



8 Replies
  1. 15

    Il GregorianCalendar standar di classe ha un isLeapyear() metodo. Se tutto quello che ho è un numero dell’anno (per dire, 2008), quindi costruire un data utilizzando questo costruttore, e quindi controllare il isLeapYear() metodo seguito.

    • Bah. Stupido Java e le sue librerie per TUTTO. 😛 (+1)
    • Sì, utilizzo di librerie per le date SCHIFO. Passando il tuo test per gli anni bisestili, diversi mesi, secondi, additivo per la matematica è il modo per… nevermind. 🙂
    • Ma, allora si può facilmente definire la “MyCalendar” come il nuovo standard, e che aveva magicamente passare tutti i test necessari.
    • Solo il built-in librerie di data succhiare. Chiedi Jon Skeet su di esso.
    • Sì, ho scritto questo in tarda serata e mi sono dimenticato di dire che sto usando il Calendario di classe e il Calendario.get(Calendar.DAY_OF_YEAR) calcolare la differenza. Ho solo un dubbio, se io, per esempio, il Calendario.aggiungere(Calendario.MESE, 14) si è imposta risultanti anno come un anno bisestile se è uno? O tutti gli anni sono solo 365 giorni?
    • Si deve, ed è abbastanza facile da testare. Impostare una data in un noto anno bisestile, e attraversare il 29 Febbraio con la tua aggiunta.
    • Yeap, non. Nessun bisogno di GregorianCalendar poi, userò quello che ho utilizzato fino ad ora e calcolare il resto con il TimeUnit.GIORNI.convert().

  2. 47

    Un altro modo per farlo è quello di chiedere l’ Calendar di classe per l’effettivo di giorni al massimo in un dato anno:

    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    
    int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
    System.out.println(numOfDays);

    Questo ritorno 366 per un anno bisestile, 365 per uno normale.

    Nota, ho usato getActualMaximum invece di getMaximum, che restituisce sempre 366.

    • questa dovrebbe essere la risposta corretta
    • In realtà, questa Risposta è stata obsolete di Java 8 nel 2014. Il fastidioso vecchia data classi a tempo, ad esempio java.util.Date, java.util.Calendar, e java.text.SimpleTextFormat sono ora legacy, soppiantato da java.il tempo classi. Vedere Tutorial da Oracle.
    • Sono d’accordo che, se possibile, si dovrebbe utilizzare il java.classi a tempo. Ma per quelli di noi che non hanno il lusso di usare Java 8 ma questa risposta non è obsoleto. L’OP è stato in riferimento a java.util.Calendario e java.util.Data, e questa risposta è ancora molto applicabile per molti di noi. Era la risposta che stavo cercando.
    • Molto di java.ora la funzionalità è un porting di Java 6 e 7 nel ThreeTen-Backport progetto. Ulteriormente adattato per Android nel ThreeTenABP progetto. Quindi non c’è motivo di soffrire con la misera eredità Date/Calendar/etc. classi. Vedere la mia Risposta per i dettagli.
  3. 12

    tl;dr

    Year.of( 2015 )
        .length()

    java.tempo

    In Java 8 e poi abbiamo il java.pacchetto. (Tutorial)

    length

    Il Year classe rappresenta un singolo valore dell’anno. È possibile interrogare la sua lunghezza.

    int daysInYear = Year.of( 2015 ).length();

    isLeap

    Si può anche chiedere se un anno è Bisestile o meno.

    Boolean isLeapYear = Year.isLeap( 2015 );

    Come esempio, il numero di giorni in un anno utilizzando Java operatore ternario, come:

    valmin = (a < b) ? a : b;

    Nel nostro caso, vogliamo numero di giorni dell’anno. Che è di 365 per anni non Bisestili, e 366 per l’anno Bisestile.

    int daysInYear = ( Year.isLeap( 2015 ) ) ? 366 : 365 ;

    Giorno dell’anno

    Si può ottenere il giorno dell’anno il numero di una data. Che numero va da 1 a 365 o 366 in un anno bisestile.

    int dayOfYear = LocalDate.now( ZoneId.of( "America/Montreal" ).getDayOfYear() ;

    Di andare nella direzione opposta, ottenere un appuntamento per un giorno-anno.

    Year.now( ZoneId.of( "America/Montreal" ) ).atDay( 159 ) ;

    Si potrebbe determinare trascorso giorni dal confronto di questi giorni-di-anno i numeri quando si tratta di un singolo anno. Ma c’è un modo più semplice; continua a leggere.

    Giorni trascorsi

    Utilizzare il ChronoUnit enum per calcolare il tempo trascorso giorni.

    LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ;
    LocalDate stop = LocalDate.of( 2017 , 3 , 11 ) ;
    int daysBetween = ChronoUnit.DAYS.between( start , stop );

    Gestisce automaticamente Anno Bisestile.


    Su java.tempo

    Il java.tempo quadro è costruito in Java 8 e versioni successive. Queste classi soppiantare il vecchio fastidioso legacy data di classi a tempo come java.util.Data, Calendario, & SimpleDateFormat.

    Il Joda Tempo progetto, ora in modalità di manutenzione, consiglia di migrazione per il java.tempo classi.

    Per saperne di più, vedere il Oracle Tutorial. E di ricerca di Overflow dello Stack per molti esempi e spiegazioni. Specifica è JSR 310.

    Dove ottenere il java.classi a tempo?

    Il ThreeTen-Extra progetto si estende java.ora con le classi aggiuntive. Questo progetto è un terreno di prova per eventuali future integrazioni di java.tempo. Si possono trovare alcune classi utili come l’ Intervallo, YearWeek, YearQuarter, e più.

    • Che bello, ma NON di “ottimizzare” il mio inglese.
    • lei, signore, a vincere la medaglia 🎖 Grazie!
  4. 6

    Per DateTime calcoli mi consiglia di utilizzare il JodaTime biblioteca. Per quello che ti serve, in particolare, sarebbe una fodera:

    Days.daysBetween(date1, date2).getDays();

    Spero che questo aiuta.

    • +1 per l’aggiunta obbligatoria Joda-Tempo di risposta
    • Non interessati all’attuazione di una intera libreria solo per fare un semplice calcolo.
  5. 3

    Si può guardare la pagina di Wikipedia per alcuni molto bello pseudocodice:

    if year modulo 400 is 0
           then is_leap_year
    else if year modulo 100 is 0
           then not_leap_year
    else if year modulo 4 is 0
           then is_leap_year
    else
           not_leap_year

    Sono sicuro che si può capire come implementare la logica in Java. 🙂

    • Che assomiglia a re-inventare la ruota.
    • Sì, d’accordo, questa è la prima che ho conosciuto su Java GregorianCalendar classe. Java MOLTE altre di data/ora a parte gli aspetti, che è il modo di andare in questo caso!
    • perché il voto? Questo è “il” algoritmo per trovare un anno bisestile.
    • Catikkas: È sicuramente corretto, ma la domanda è: “è stata una risposta utile”. Questo è un Java domanda, così posso vedere un argomento per l’utilizzo di librerie Java di essere una risposta migliore e reinventare la ruota sta male. Grazie per l’upvote però! 🙂
  6. 1

    È possibile utilizzare il TimeUnit classe. Per le tue specifiche esigenze questo dovrebbe fare:

    public static int daysBetween(Date a, Date b) {
        final long dMs = a.getTime() - b.getTime();
        return TimeUnit.DAYS.convert(dMs, TimeUnit.MILLISECONDS);
    }

    Onestamente, non vedo dove anni bisestili gioca alcun ruolo in questo calcolo, però. Forse ho perso qualche aspetto della tua domanda?

    Edit: Stupido me, gli anni bisestili magia accade nel Date.getTime(). Comunque, non hai a che fare con esso in questo modo.

Lascia un commento