【问题标题】:Date calculation - Daylight saving time (DST) and Timezone issue - Turkey日期计算 - 夏令时 (DST) 和时区问题 - 土耳其
【发布时间】:2017-02-08 06:30:16
【问题描述】:

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

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

基于没有。应计算输入“截止日期”的天数,因此根据上述输入的起始日期和计算“截止日期”的天数值应为 2016 年 1 月 11 日,但由于一些错误的计算,它显示 2016 年 10 月 31 日.

时区 - 土耳其伊斯坦布尔

请参考下图截取的代码 -

从代码中可以清楚地看出正在使用的原型 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 代码。

【问题讨论】:

  • 使用momentjs (momentjs.com/docs) 可以省去不少麻烦。它是一个功能强大的大型图书馆,致力于与时间合作。
  • 所有相关代码都应包含在问题本身中,而不是图像中。
  • 注意正确拼写JavaScript,避免与Java发生冲突。
  • 评估? 2016 年?这段代码看起来像是 1995 年的东西。当您发布实际代码时,您会得到一些实际答案。 :-)
  • @MikeMcCaughan - 添加了 JavaScript 代码。

标签: javascript html datetime prototypejs timezone-offset


【解决方案1】:

可能不值得发布代码,因为它有一些根本性的错误,不应该在新千年中幸存下来。

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 将其保持在主机时区。

【讨论】:

  • .toLocaleString() 返回不同的日期格式 - Chrome 以 DD/MM/YYYY 返回,Safari 以 MM/DD/YYYY 格式返回。 2 台不同的机器具有相同的 chrome 版本,但日期格式不同。
  • @Santosh— toLocaleString 返回一个依赖于实现的字符串,该字符串可能在每个实现中都不同,并且不一定要注意主机设置。我使用它是因为 SO 控制台似乎已将 Date.prototype.toString 替换为替换的 Date.prototype.toISOString,这很不方便。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2015-06-07
  • 1970-01-01
  • 2011-08-01
  • 2012-03-25
  • 2023-04-05
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多