我正在开发一个报告系统。 在我的报告系统中,我将自动加上选择日期的日期。 我使用了以下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;
此功能在几乎平台和浏览器上也能正常运行。 但是在iPhone Safari和Windows 8.1这样的特定平台或浏览器上,我得到了不同的结果。 如果我加3天,我可以得到加2天的结果。 我在我的电脑,iPhone和browserstack.com上测试过。 我非常希望得到你的帮助。 感谢。
答案 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中午。
答案 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());
}