javascript - 日期计算 - 夏令时 (DST) 和时区问题 - 土耳其

标签 javascript html datetime prototypejs timezone-offset

浏览器上 JavaScript 中的日期计算问题。有3个参数—— 起始日期、天数和截止日期

使用 JavaScript 中的日历组件选择的起始日期 = 30/10/2016 输入的天数 = 2

基于没有。应计算输入“至今”的天数,因此根据上面输入的起始日期和计算的天数“至今”值应为 01/11/2016,但由于计算错误,它显示为 31/10/2016 .

时区 - 土耳其 Istanbul 尔

请参阅下图以获取代码片段 -

从代码片段中可以清楚地看出,正在使用原型(prototype) 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;
} 

enter image description here

似乎 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 - 日期计算 - 夏令时 (DST) 和时区问题 - 土耳其,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39778629/

相关文章:

javascript - 尝试从 Javascript 文件输出到 HTML 页面?

javascript - 添加兄弟 div 后更改 div 的样式

python - 在 Python 中将字符串日期转换为时间戳

perl - 如何在 Perl 中转换时区?

java - 如何获取上个月的第一个日期和最后一个日期? ( java )

javascript - 在 Firefox 中使用 eval 方法从字符串中获取类

javascript - 滚动时只触发一次函数(scrollstop)

javascript - jquery 尝试滑动一个已经打开的 div,创建一个 'bounce' 效果

javascript - 在 Chrome 控制台中显示 jQuery (JS) 对象的内容

javascript - 在《 'You Don' t Know JS》一书中,我有一个关于 isNaN polyfills 的问题