JavaScript日期加上一些日期问题

javascript date plus some days issue

本文关键字:日期 问题 JavaScript      更新时间:2023-09-26

我正在开发一个报告系统。在我的报告系统中,我将自动加上所选日期的日期。我使用了以下Javascript代码片段。

function add_date(curdate, days) {
  
  //curdate format : "yyyy-mm-dd"
  var newdate = new Date(curdate);
  newdate.setDate(newdate.getDate() + days);
  var dd = newdate.getDate();
  var mm = newdate.getMonth() + 1;
  var y = newdate.getFullYear();
  if(dd < 10)
    dd = '0' + dd;
  if(mm < 10)
    mm = '0' + mm;
  var someFormattedDate = y + '-' + mm + '-' + dd;
  return someFormattedDate;
  
}

此功能几乎可以在平台和浏览器上运行。但是在iPhone Safari和Windows 8.1等特定平台或浏览器上,我得到了不同的结果。如果我加 3 天,我可以得到加 2 天的结果。我在电脑、iPhone 和 browserstack.com 上进行了测试。我想要你的帮助。谢谢。

我想说你最好的选择是研究Moment.js

但是你可以尝试这样的东西...

// add 5 days
console.log(add_date('2016-02-18T15:53:02Z', 5));
function add_date(curdate, days) {
    var newdate = new Date(curdate);
    // add number of days
    return new Date(newdate.getTime() + ((24 * 60 * 60 * 1000) * days));
}

日期问题可能是因为时区解释。

日期字符串"yyyy-mm-dd"应该表示午夜 UTC,但某些浏览器可能不遵守此约定。

若要解决此问题,可以通过将固定时间附加到日期字符串来执行快速修复。

添加这个:

  curdate += 'T12:00:00Z';

肯定会将时间设置为UTC中午。

jsfiddle 在这里

正如在其他答案中指出的,ECMAScript 2015 要求将 y-m-d 格式解析为 UTC,但是曾经有一段时间 ECMCAScript 2015 被解释为将其视为本地(根据 ISO 8601 和没有时区的长格式日期和时间字符串),但是这种解释被颠倒了(请注意,没有时区的 ISO 8601 格式日期和时间被视为本地)。

此外,并非所有使用的浏览器都能正确解析 ISO 格式,有些浏览器根本不解析它们。

如果您在格林威治以西,那么new Date('2016-02-20')将为当地的 2 月 19 日而不是 20 日创建日期,这可能会令人困惑。

没有说你是否希望它是本地的,但既然这是为了报告,也许它应该是。您可以使用库进行解析,但只需要几行代码:

/*  Parse and validate a date in format yyyy-mm-dd
**  Note that a date without a timezone is treated as LOCAL, per ISO 8601
**  @param {string} s - date in format y-m-d
**  @returns {Date} time vlaue is NaN if date is invalid
*/
function parseISODateLocal(s){
  var b = s.split(/'D/);
  var d = new Date(b[0], --b[1], b[2]);
  return d && d.getMonth() == b[1]? d : new Date(NaN);
}

要将日期格式设置为 y-mm-dd,可以使用:

/* Return an ISO 8601 string without timezone
** @param {Date} d - date to create string for
** @returns {string} string formatted as ISO 8601 without timezone
*/
function toISODateLocal(d) {
  function z(n){return (n<10?'0':'') + n}
  return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' + z(d.getDate());
}