Question

essayer d'utiliser GregorianCalendar, je suis resté coincé sur une singularité tout en calculant le nombre de jours depuis une date donnée. Dans l'interprète Scala, j'ai entré:

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

Je ne sais pas si le fait que 1976 est une année de bissions, mais les jours1 et les jours2 auraient dû être séparés par 1. C'est le seul moment de l'histoire depuis 1970 que cette singularité se produit.

Vouloir savoir ce qui se passe, je calcule la différence entre les deux dates précédemment mentionnées, et cela ne me donne que exactement 23 heures de différence!Que s'est-il passé à cette date?Wikipedia ne dit apparemment rien à ce sujet.

Et encore plus important, comment calculer le nombre réel de jours depuis une date particulière?

Était-ce utile?

La solution

Si l'option d'une division float n'est pas disponible, la meilleure réponse que je puisse penser est d'ajouter une heure (1000 * 3600) tout en calculant une différence entre deux jours:

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

Cela devrait fonctionner pour chaque date, car vous ne souffrez plus d'heures de saut.

Autres conseils

Le problème

Les jours d'épargne du jour ne sont que 23 heures.

et selon Ce le 28 mars 1976 était une journée d'épargne à la lumière du jour moins de Paris. L'heure entre 1h du matin et 2h du matin ce jour-là n'existait tout simplement pas.

Bien que ce soit une question locale depuis sur mon ordinateur, je comprends bien:

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

Je ne suis pas à Paris ni nulle part ailleurs qui change de temps ce jour-là; Le temps a changé le 25 avril 1976 où je suis. Donc, je reçois le comportement "Scredid Day" à cette date:

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 pointe dans les commentaires que la raison probable que vous ne remarquez que la différence de date incorrecte ici est que toutes les autres jours d'épargne à la lumière du jour sont compensés par les jours de 25 heures qui se produisent également au cours de la journée d'épargne au jour est corrigé.

la solution

Utilisez une meilleure bibliothèque pour le traitement de la date. Le La bibliothèque Joda-Time le fait correctement (ainsi que d'un meilleur cadre de date / heure globale):

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 a souligné ce que je pense: ce jour-là est un jour de «heure d'été». Comme ce jour n'est que 23h de 23 heures, la division Eulidienne d'une journée est égale à 0.

En fait, l'utilisation d'objets GregorianCalendar n'utilise qu'une date de millisecondes, ainsi de division d'un jour en tant qu'oeur entier tronque seulement un résultat.

au lieu d'une division euclidian (entier), essayez de faire une division de flotteur, puis du résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top