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>
4 Réponses :
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. P>
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. P>
(2009,8,18) n'est pas le 18 août. C'est le 18 septembre. P>
Les mois sont un index à base de zéro. 0 est janvier.
Oh javascript, tu es si drôle!
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
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 code> a une partie de temps de 0 heure, 0 minutes, 0 secondes et 0 millisecondes. Vous devez faire la même chose à aujourd'hui code> 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.
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));
Oui, le framework ASP .NET AJAX étend l'objet de date de la clientèle