日期计算 - 夏令时 (DST) 和时区问题 - 土耳其
Date calculation - Daylight saving time (DST) and Timezone issue - Turkey
浏览器 JavaScript 中的日期计算问题。有 3 个参数 -
从日期、天数和到日期
从 JavaScript = 30/10/2016 中使用日历组件选择的日期
输入的天数 = 2
基于没有。应计算输入的天数 "To Date",因此根据上面输入的起始日期和计算的天数 "To Date" 值应为 01/11/2016 但由于计算错误,它显示 31/10 /2016.
时区 - 土耳其伊斯坦布尔
代码片段请参考下图-
从代码中可以清楚地看出正在使用原型 JavaScript 库。
dateUtil.prototype.addDays=function(date,noofDays)
{
var _dateData=date.split("/");
var _date=eval(_dateData[0]);
var _month=eval(_dateData[1]);
var _year=eval(_dateData[2]);
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;
return addedDate;
}
似乎 noofDays*24*60*60*1000 逻辑是没有考虑 DST 的问题。
有 2 个时区显示,代码相同但日期格式不同。
请就此提出任何指导或阅读建议。
编辑:
JavaScript 添加了代码。
可能不值得发布代码,因为它有一些本不应该在新千年中幸存下来的基本错误。
var _date = eval(_dateDate[0]);
不要使用 eval。有少数情况是合适的,但一般情况下,不要使用它。曾经。上同:
var _date = _dateDate[0];
然后是:
var newFormatedDate = new Date('' + _month + '/' + _date + '/' + _year)
您通过将日期字符串拆分成多个部分来避免使用 Date 构造函数解析字符串,从而走上了正确的轨道。但是随后您创建了一个新字符串并使用 Date 对其进行了解析,从而破坏了这项出色的工作。直接使用零件即可:
var newFormatedDate = new Date(_year, _month-1, _date)
它消除了日期解析的所有变幻莫测,也减少了输入。此外,Date 对象没有格式,因此 date 这样的名称就可以了。
要添加 n 天,只需将它们添加到日期:
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 控制台似乎总是将日期写为 Z 时区中的 ISO 8601 字符串,因此我使用 toLocaleString 将其保留在主机时区中。
浏览器 JavaScript 中的日期计算问题。有 3 个参数 - 从日期、天数和到日期
从 JavaScript = 30/10/2016 中使用日历组件选择的日期 输入的天数 = 2
基于没有。应计算输入的天数 "To Date",因此根据上面输入的起始日期和计算的天数 "To Date" 值应为 01/11/2016 但由于计算错误,它显示 31/10 /2016.
时区 - 土耳其伊斯坦布尔
代码片段请参考下图-
从代码中可以清楚地看出正在使用原型 JavaScript 库。
dateUtil.prototype.addDays=function(date,noofDays)
{
var _dateData=date.split("/");
var _date=eval(_dateData[0]);
var _month=eval(_dateData[1]);
var _year=eval(_dateData[2]);
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;
return addedDate;
}
似乎 noofDays*24*60*60*1000 逻辑是没有考虑 DST 的问题。 有 2 个时区显示,代码相同但日期格式不同。
请就此提出任何指导或阅读建议。
编辑: JavaScript 添加了代码。
可能不值得发布代码,因为它有一些本不应该在新千年中幸存下来的基本错误。
var _date = eval(_dateDate[0]);
不要使用 eval。有少数情况是合适的,但一般情况下,不要使用它。曾经。上同:
var _date = _dateDate[0];
然后是:
var newFormatedDate = new Date('' + _month + '/' + _date + '/' + _year)
您通过将日期字符串拆分成多个部分来避免使用 Date 构造函数解析字符串,从而走上了正确的轨道。但是随后您创建了一个新字符串并使用 Date 对其进行了解析,从而破坏了这项出色的工作。直接使用零件即可:
var newFormatedDate = new Date(_year, _month-1, _date)
它消除了日期解析的所有变幻莫测,也减少了输入。此外,Date 对象没有格式,因此 date 这样的名称就可以了。
要添加 n 天,只需将它们添加到日期:
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 控制台似乎总是将日期写为 Z 时区中的 ISO 8601 字符串,因此我使用 toLocaleString 将其保留在主机时区中。