Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何向JavaScript日期对象添加年、月、日、小时、分钟或秒?_Javascript_Date_Datetime_Time_Date Arithmetic - Fatal编程技术网

如何向JavaScript日期对象添加年、月、日、小时、分钟或秒?

如何向JavaScript日期对象添加年、月、日、小时、分钟或秒?,javascript,date,datetime,time,date-arithmetic,Javascript,Date,Datetime,Time,Date Arithmetic,我经常遇到这样的情况:我想在JavaScript中向日期对象添加年、月、日、小时、分钟或秒。对于每个特定的添加编辑,有许多方法可以描述:例如在addday中,但我还没有找到一个完整的stackoverflow解决方案,所以我决定以风格分享我的方法。是一种不使用框架来处理问题的方法 评论和回答中建议的问题的其他解决方案: 处理此问题的框架/库: 谢谢JonnyIrving/Eugene Mihaylin/Pac0 谢谢你,罗布 谢谢你,罗布 特定添加主题的示例感谢Pac0: 天数: 会议记录: 工

我经常遇到这样的情况:我想在JavaScript中向日期对象添加年、月、日、小时、分钟或秒。对于每个特定的添加编辑,有许多方法可以描述:例如在addday中,但我还没有找到一个完整的stackoverflow解决方案,所以我决定以风格分享我的方法。是一种不使用框架来处理问题的方法

评论和回答中建议的问题的其他解决方案:

处理此问题的框架/库:

谢谢JonnyIrving/Eugene Mihaylin/Pac0

谢谢你,罗布

谢谢你,罗布

特定添加主题的示例感谢Pac0:

天数:

会议记录:

工作时间:

月份:


我不会将任何答案标记为已接受,因为我认为有多种有效方法

我的方法是延长日期。原型具有以下附加功能:

Date.prototype.addYears = Date.prototype.addYears || function (y, supressSet) {
    if (!supressSet) { this.setFullYear(this.getFullYear() + y); return this; }
    return new Date(this).addYears(y);
};
Date.prototype.addDays = Date.prototype.addDays || function (d, supressSet) {
    return this.addHours(d * 24, supressSet);
};
Date.prototype.addHours = Date.prototype.addHours || function (h, supressSet) {
    return this.addMinutes(h * 60, supressSet);
};
Date.prototype.addMinutes = Date.prototype.addMinutes || function (m, supressSet) {
    return this.addSeconds(m * 60, supressSet);
};
Date.prototype.addSeconds = Date.prototype.addSeconds || function (s, supressSet) {
    return this.addMilliseconds(s * 1000, supressSet);
};
Date.prototype.addMilliseconds = Date.prototype.addMilliseconds || function (ms, supressSet) {
    if (!supressSet) { this.setTime(this.getTime() + ms); return this; }
    return new Date(this).addMilliseconds(ms);
};
supersSet参数是可选的,它使相应的函数作为getter工作,而不改变对象本身。如果ommited,则计算结果为false,这意味着将修改原始日期对象

正如我在评论中指出的,我没有考虑闰年。为此,我对解决方案进行了数月的调整:


尝试摆脱JS date hell,使用广泛使用的:

等等。

您可以使用


或者手动创建,比如在这个

中,你可能不想引入一个库来解决这个问题,我知道有时候最好是普通的,但就我个人而言,我发现,当你引入Moment.JS库时,在JS中处理日期和时间的所有头痛都变得简单多了

您可以在此处查看文档:

下面我展示了它在增加时间单位方面可以做些什么,但正如您从文档中看到的,它做的更多。例如,它非常擅长格式化日期对象

新日期; var nowPlusYear=moment.add1,“年”; var nowPlusMonth=矩.add1,“月”; var nowPlusMinute=moment.add1,“分钟”; console.logIn将是1年,现在是plusyear; console.logIn一个月,现在是plusmonth; console.logIn 1分钟,现在是plusMinute;
如今,在多个库位于同一命名空间中的情况下,扩展本机原型不再真正有用。这就是过去流行的图书馆被打破的原因,因为他们正在为谁可以用他们的addX版本来延长日期、功能和对象而斗争。此外,增加一天并不总是增加24小时。这在某种程度上取决于时区,即使在UTC中,也有闰秒,但没有考虑到。这似乎是一个毫无意义的练习,而且是错误的。添加1天与添加跨越夏令时边界的24小时不同。此外,您添加月份的方式意味着1月31日+1个月将是3月2日或3日,这取决于是否是闰年。添加负月份将产生类似的结果:3月31日+1个月将是3月2日或3日。你会在数月内得到类似的结果,分别是31天和30天。如果你的计算机位于夏令时之后的时区,你可以尝试。addDays180,结果将在1小时内消失。简言之:日期/日历算法比看起来要困难得多,滚动自己的会让你陷入很多陷阱,这些库处理起来或多或少比较平稳。相关:如何使用javascript添加减法日期相关:incrementing-a-date-in-javascript相关:向javascript日期添加天数@Pac0是的,我明确地写道,对于每个特定的添加,都有许多描述方法。。。你只是发布了其中的一些…第一个也只是增加了几天-但是的,引用实际上是好的。我会在问题中加入一些。谢谢你的贡献。谢谢你的贡献,我在原始问题中添加了链接。我想我不会将任何答案标记为被接受,因为在我看来,现在有多种有效的方法,我会标记这一种和我的。投票表决吧。当然没问题!对原始问题进行了很好的编辑。
var DateHelper = {
    isLeapYear: function (year) {
        return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
    },
    getDaysInMonth: function (dateinput) {
        return [31, (DateHelper.isLeapYear(dateinput.getFullYear()) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][dateinput.getMonth()];
    }
};

Date.prototype.addMonths = function (m, supressSet) {
    var n = this.getDate(),nDate=new Date(this);
    nDate.setDate(1);
    nDate.setMonth(nDate.getMonth() + m);
    nDate.setDate(Math.min(n, DateHelper.getDaysInMonth(nDate)));
    if (!supressSet) {
        this.setDate(nDate.getDate()); this.setMonth(nDate.getMonth());
    }
    return nDate;
};
moment('2018-01-01').add(1, 'day'); 

moment('2018-01-01').add(1, 'hour');
moment('2000-01-01').add(1, 'year');
moment('2000-01-01').add(1, 'month');
moment('2000-01-01').add(1, 'days');
moment('2000-01-01').add(1, 'hour');