2016-09-29 4 views
2

Date problème de calcul en JavaScript sur le navigateur. Il y a 3 paramètres - A partir de ce jour, Nombre de jours & à ce jourCalcul de la date - Heure d'été (DST) et Fuseau horaire - Turquie

De Date sélectionnée en utilisant le composant de calendrier en JavaScript = 30/10/2016 Nombre de jours entré = 2

Sur la base non. des jours entrés "À Date" doivent être calculés, comme indiqué ci-dessus. Date de & Nombre de jours calculés "À ce jour" valeur doit être 01/11/2016 mais en raison d'un mauvais calcul, il montre 31/10/2016 .

Time Zone - Istanbul, Turquie

S'il vous plaît se référer image ci-dessous pour le code snipped -

Comme il est clair à partir du code Snipped ce prototype bibliothèque JavaScript utilisé.

dateUtil.prototype.addDays=function(date,noofDays) 
 
{ 
 
\t var _dateData=date.split("/"); 
 
\t var _date=eval(_dateData[0]); 
 
\t var _month=eval(_dateData[1]); 
 
\t var _year=eval(_dateData[2]); 
 
\t var newFormatedDate = new Date(""+_month+"/"+_date+"/"+_year); 
 
     var newAddedDate=newFormatedDate.getTime() + noofDays*24*60*60*1000; 
 
     var theDate = new Date(newAddedDate); 
 
     var dd = theDate.getDate(); 
 
     var mm = theDate.getMonth()+1; // 0 based 
 
     if(mm<10) 
 
      mm="0"+mm; 
 
     var yy = theDate.getYear(); 
 
     if (yy < 1000) 
 
     yy +=1900; // Y2K fix 
 
     var addedDate=""+dd+"/"+mm+"/"+yy; 
 
     
 
\t return addedDate; 
 
}

enter image description here

Il semble noofDays * 24 * 60 * 60 * 1000 logique est le problème où l'heure d'été n'est pas envisagée. Il y a 2 fuseau horaire affichant le même code mais avec un format de date différent.

Pourriez-vous nous donner des conseils ou faire des lectures à ce sujet?

Editer: Code JavaScript ajouté.

+3

Utilisez le momentjs (http://momentjs.com/docs/) Cela vous évitera bien des maux de tête. C'est une énorme bibliothèque puissante dédiée à travailler avec le temps. –

+5

Tout le code pertinent devrait être inclus dans la question elle-même, pas dans une image. –

+2

Veillez à bien épeler 'JavaScript' pour éviter une collision avec' Java'. –

Répondre

3

Probablement pas la peine de poster le code car il a quelques erreurs fondamentales qui n'auraient pas dû survivre au nouveau millénaire.

var _date = eval(_dateDate[0]); 

Ne pas utiliser eval. Il y a un petit nombre de cas où c'est approprié, mais en général, ne l'utilisez pas. Déjà. Ce qui précède est le même que:

var _date = _dateDate[0]; 

Ensuite, il y a:

var newFormatedDate = new Date('' + _month + '/' + _date + '/' + _year) 

Vous avez commencé sur la bonne voie en évitant les chaînes d'analyse syntaxique avec le constructeur Date en divisant la chaîne de date dans ses parties. Mais vous avez défait ce bon travail en créant une nouvelle chaîne et en l'analysant avec Date. Il suffit d'utiliser des pièces directement:

var newFormatedDate = new Date(_year, _month-1, _date) 

qui supprime tous les caprices de l'analyse syntaxique de date et est moins à taper aussi bien. En outre, les objets Date n'ont pas de format, donc un nom comme date est correct.

Pour ajouter n jours, il suffit de les ajouter à la date:

var date = new Date(_year, _month-1, _date) 
date.setDate(date.getDate() + 2); 

Ainsi, votre fonction peut être:

function dateUtil(){} 
 

 
/* Add days to a date 
 
** @param {string} date - date string in dd/mm/yyyy format 
 
** @param {number} noofDays - number of days to add 
 
** @returns {Date} 
 
*/ 
 
dateUtil.prototype.addDays = function(date, noofDays) { 
 
    var dateData = date.split('/'); 
 
    var date = new Date(dateData[2], dateData[1] - 1, dateData[0]); 
 
    date.setDate(date.getDate() + +noofDays); 
 
    return date; 
 
} 
 

 
var d = new dateUtil(); 
 

 
console.log(d.addDays('23/09/2016',3).toLocaleString());

J'ai utiliser +noofDays à assurez-vous que c'est un numéro. En outre, la console SO semble toujours écrire des dates en tant que chaînes ISO 8601 dans le fuseau horaire Z. J'ai donc utilisé toLocaleString pour le conserver dans le fuseau horaire de l'hôte.

+0

.toLocaleString() renvoyant un format de date différent - Chrome renvoyant en JJ/MM/AAAA et Safari retournant au format MM/JJ/AAAA. 2 machine différente a le même format de date de la version chromée venant différent. – Santosh

+0

@ Santosh- * toLocaleString * renvoie une chaîne dépendante de l'implémentation qui peut être différente dans chaque implémentation et ne prend pas nécessairement en compte les paramètres de l'hôte. Je l'ai utilisé parce que la console SO semble avoir remplacé * Date.prototype.toString * par remplacé * Date.prototype.toISOString *, ce qui n'est pas pratique. – RobG