2016-09-29 3 views
2

Ошибка расчета даты в JavaScript в браузере. Есть 3 параметра - От Дата, Кол-во дней & Для ДатаРасчет даты - Летнее время (DST) и проблема с часовым поясом - Турция

С даты выбраны с помощью календаря компонент в JavaScript = 30/10/2016 Кол-во дней введенную = 2

не Based на нет. дней, введенных в «Дата», должно быть рассчитано так, как указано выше. From date & Число дней, рассчитанных по значению «Дата», должно быть 01/11/2016, но из-за неправильного расчета показывается 31/10/2016 ,

Time Zone - Стамбул, Турция

Пожалуйста, изучите приведенные ниже изображения для кода пропущено -

Как видно из кода пропущено, что прототип JavaScript библиотеки используется.

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

кажется noofDays * 24 * 60 * 60 * 1000 логика проблема, где DST не рассматривается. Существует 2 часовых пояса с одним и тем же кодом, но с другим форматом даты.

Пожалуйста, не могли бы вы посоветовать какие-либо рекомендации или прочитать об этом.

Редактировать: Код JavaScript добавлен.

+3

Использование momentjs (http://momentjs.com/docs/) Это сэкономит вам немало головных болей. Его огромная мощная библиотека, посвященная работе со временем. –

+5

Весь соответствующий код должен быть включен в сам вопрос, а не на изображение. –

+2

Правильно соблюдайте 'JavaScript', чтобы избежать столкновения с' Java'. –

ответ

3

Возможно, не стоит публиковать код, так как он имеет некоторые фундаментальные ошибки, которые не должны были переживать новое тысячелетие.

var _date = eval(_dateDate[0]); 

Не используйте Eval. Существует небольшое количество случаев, когда это уместно, но в целом просто не используйте его. Когда-либо. Выше такой же, как:

var _date = _dateDate[0]; 

Тогда есть:

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

Вы начали на правильном пути, избегая разборе строк с датой конструктора, разделив строку даты в ее детали. Но тогда вы отменили эту хорошую работу, создав новую строку и разобрав ее с помощью Date. Просто используйте части непосредственно:

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

, который удаляет все капризы Дата разборе и меньше набирать, а также. Кроме того, объекты Date не имеют формата, поэтому имя датировано в порядке.

Чтобы добавить н дней, просто добавьте их к дате:

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

Так что ваша функция может быть:

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());

Я использовать +noofDays для убедитесь, что это число. Кроме того, консоль SO всегда записывает даты как строки ISO 8601 в Z-часовом поясе, поэтому я использовал toLocaleString, чтобы сохранить его в часовом поясе хоста.

+0

.toLocaleString() возвращает другой формат даты - Chrome возвращается в DD/MM/YYYY и Safari, возвращаясь в формате MM/DD/YYYY. 2 разные машины имеют такую ​​же хромовую версию, что и формат даты. – Santosh

+0

@ Santosh- * toLocaleString * возвращает строку, зависящую от реализации, которая может быть различной в каждой реализации и не обязательно требует уведомления о настройках хоста. Я использовал его, потому что SO-консоль, похоже, заменила * Date.prototype.toString * с заменой * Date.prototype.toISOString *, что неудобно. – RobG

Смежные вопросы