7
votes

DATE JavaScript Sous-section

Je cherche un moyen de faire une soustraction appropriée entre deux objets de date javascript et obtenir la journée Delta.

C'est mon approche, mais elle échoue à la date d'aujourd'hui comme entrée: P>

<script type="text/javascript">
function getDayDelta(incomingYear,incomingMonth,incomingDay){
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay);
var today = new Date();

var delta = incomingDate - today;
var resultDate = new Date(delta);
return resultDate.getDate();
}
//works for the future dates:
alert(getDayDelta(2009,9,10));
alert(getDayDelta(2009,8,19));

//fails for the today as input, as expected 0 delta,instead gives 31:
alert(getDayDelta(2009,8,18));
</script>


0 commentaires

4 Réponses :


5
votes

Vous pouvez appeler GetTime () sur chaque objet de date, puis soustraire le plus ultérieur du précédent. Cela vous donnerait le nombre de différences de millisecondes entre les deux objets. À partir de là, il est facile d'arriver à des jours.

Un couple de hoques à surveiller, cependant: 1) l'heure d'épargne de la lumière du jour, et 2) S'assurer que votre temps provenait du même fuseau horaire.


0 commentaires

6
votes

(2009,8,18) n'est pas le 18 août. C'est le 18 septembre.


2 commentaires

Les mois sont un index à base de zéro. 0 est janvier.


Oh javascript, tu es si drôle!



7
votes

Le numéro de mois dans la fonction de constructeur de date est à base de zéro, vous devez soustraire un, et je pense que c'est plus simple pour calculer le delta à l'aide de l'horodatage:

function getDayDelta(incomingYear,incomingMonth,incomingDay){
  var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay),
      today = new Date(), delta;
  // EDIT: Set time portion of date to 0:00:00.000
  // to match time portion of 'incomingDate'
  today.setHours(0);
  today.setMinutes(0);
  today.setSeconds(0);
  today.setMilliseconds(0);

  // Remove the time offset of the current date
  today.setHours(0);
  today.setMinutes(0);

  delta = incomingDate - today;

  return Math.round(delta / 1000 / 60 / 60/ 24);
}


getDayDelta(2008,8,18); // -365
getDayDelta(2009,8,18); // 0
getDayDelta(2009,9,18); // 31


4 commentaires

Merci pour le correctif, mais cela semble échouer à: GetDayDelta (2009,19); // devrait revenir 1 mais retourne 0 (il est 18ème à mon localtime)


@CRI: Le problème est que incompingdate a une partie de temps de 0 heure, 0 minutes, 0 secondes et 0 millisecondes. Vous devez faire la même chose à aujourd'hui ou vous obtiendrez des journées partielles pendant une journée à venir / derrière. J'ai édité la réponse pour refléter le changement.


@CMS: Vous devez tout supprimer (heures, minutes, secondes et millisecondes), sinon vous obtenez des deltas de 0,99991513 ...


@Gant Wagner: C'est pourquoi j'utilise Math.Round dans la déclaration de retour.



0
votes

Cela fonctionnera mieux, mais cela ne traite pas correctement les valeurs de résultat négatives. Vous voudrez peut-être simplement analyser les valeurs vous-même et les traiter.

function getDayDelta(incomingYear,incomingMonth,incomingDay){
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay);
var today =   new Date();
today = new Date(Date.parse(today.format("yyyy/MM/dd")));

var delta = incomingDate - today;
if (delta == 0) { return 0; }
var resultDate = new Date(delta);
return resultDate.getDate();
}
//works for the future dates:
alert(getDayDelta(2009,9,10));
alert(getDayDelta(2009,8,19));
alert(getDayDelta(2009, 8, 18));


1 commentaires

Oui, le framework ASP .NET AJAX étend l'objet de date de la clientèle