javascript日期加上某些天问题

时间:2016-02-18 20:44:16

标签: javascript date

我正在开发一个报告系统。 在我的报告系统中,我将自动加上选择日期的日期。 我使用了以下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;
  
}
&#13;
&#13;
&#13;

此功能在几乎平台和浏览器上也能正常运行。 但是在iPhone Safari和Windows 8.1这样的特定平台或浏览器上,我得到了不同的结果。 如果我加3天,我可以得到加2天的结果。 我在我的电脑,iPhone和browserstack.com上测试过。 我非常希望得到你的帮助。 感谢。

3 个答案:

答案 0 :(得分:1)

我说你最好的选择是调查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));
}

答案 1 :(得分:0)

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

日期字符串&#39; yyyy-mm-dd&#39;应该是指午夜UTC,但有些浏览器可能不尊重这种约定。

要解决此问题,您可以通过在日期字符串中附加固定时间来进行快速修复。

添加:

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

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

jsfiddle here

答案 2 :(得分:0)

正如其他答案所指出的,ECMAScript 2015要求将ymd格式解析为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());
}