Domanda

Cercando di usare GregorianCalendar, sono rimasto bloccato su una singolarità mentre calcoli il numero di giorni da una data particolare. Nell'interprete della Scala, sono entrato:

scala>import java.util.GregorianCalendar
scala>import java.util.Calendar
scala>val dateToday = new GregorianCalendar(2012,Calendar.MAY,22).getTimeInMillis()
dateToday: Long = 1337637600000
scala>val days1 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,28).getTimeInMillis())) / (1000*3600*24)
days1: Long = 13203
scala>val days2 = (dateToday - (new GregorianCalendar(1976,Calendar.MARCH,29).getTimeInMillis())) / (1000*3600*24)
days2: Long = 13203
.

Non so se il fatto che il 1976 sia un anno bisestile, ma i giorni1 e i giorni2 avrebbero dovuto essere separati da 1. Questo è l'unico momento della storia dal 1970 che questa singolarità accade.

Volendo sapere cosa sta succedendo, calcolo la differenza tra le due date precedentemente menzionata, e mi dà solo esattamente 23 ore di differenza!Cosa è successo in quella data?A quanto pare Wikipedia non dice nulla al riguardo.

E ancora più importante, come calcolare il numero reale di giorni da una data particolare?

È stato utile?

Soluzione

Se l'opzione di una divisione float non è disponibile, la risposta migliore che posso pensare è di aggiungere un'ora (1000 * 3600) mentre calcolando una differenza tra due giorni:

scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13204
scala> (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis()) + 1000*3600) / (1000 * 3600 * 24)
days1: Long = 13203
.

Dovrebbe funzionare per ogni data, poiché non soffri più di Leap Hours.

Altri suggerimenti

il problema

Giorni di risparmio di giorno sono lunghi solo 23 ore.

e secondo Questo 28 marzo 1976 è stato un giorno della luce diurna a almeno Parigi. L'ora tra 1 del mattino e 2 del mattino in quel giorno semplicemente non esisteva.

Anche se deve essere un problema locale poiché sul mio computer ho diritto:

scala> val days1 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 28).getTimeInMillis())) / (1000 * 3600 * 24)
days1: Long = 13203

scala> val days2 = (dateToday - (new GregorianCalendar(1976, Calendar.MARCH, 29).getTimeInMillis())) / (1000 * 3600 * 24)
days2: Long = 13202
.

Non sono a Parigi o da nessun'altra parte che ha avuto un cambiamento di tempo in quel giorno; Il tempo è cambiato il 25 aprile 1976 dove sono. Quindi ottengo il comportamento "Skopped Day" in quella data:

scala> val days3 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 25).getTimeInMillis())) / (1000 * 3600 * 24)
days3: Long = 13175

scala> val days4 = (dateToday - (new GregorianCalendar(1976, Calendar.APRIL, 26).getTimeInMillis())) / (1000 * 3600 * 24)
days4: Long = 13175
.

Erwin punta nei commenti che probabilmente la ragione per cui solo nota la differenza di data errata qui è che tutti gli altri giorni di luce diurna sono compensati dai giorni di 25 ore che accadono anche in quegli anni, quando il giorno della luce del giorno è corretto.

La soluzione

Utilizzare una biblioteca migliore per l'elaborazione della data. Il Joda-Time Library lo fa correttamente (oltre ad essere un quadro di data / ora migliore in generale):

import org.joda.time.Days
import org.joda.time.DateTimeConstants
import org.joda.time.DateMidnight

val d1 = new DateMidnight(1976, DateTimeConstants.APRIL, 25)
val d2 = new DateMidnight(1976, DateTimeConstants.APRIL, 26)
val x = Days.daysBetween(d1, d2).getDays()
println(x) // 1
.

DHG ha sottolineato ciò che penso: questo giorno è un giorno "ora legale". Come questo giorno è solo 23h a lungo, la divisione euclidiana di un giorno è uguale a 0.

In effetti, l'utilizzo degli oggetti GregorianCalendar utilizza solo una data come millisecondi, quindi dividendo entro un giorno come un intero troncano solo un risultato.

Invece di una divisione euclidiana (integer), prova a fare una divisione galleggiante, quindi intorno al risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top