【发布时间】:2010-10-08 11:36:18
【问题描述】:
如何使用 JavaScript 为当前 Date 添加天数。 JavaScript 是否有像 .Net 的 AddDay 这样的内置函数?
【问题讨论】:
标签: javascript date datetime time
如何使用 JavaScript 为当前 Date 添加天数。 JavaScript 是否有像 .Net 的 AddDay 这样的内置函数?
【问题讨论】:
标签: javascript date datetime time
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
小心,因为这可能很棘手。设置tomorrow 时,它只起作用,因为它的当前值与today 的年份和月份匹配。但是,设置为像“32”这样的日期数字通常仍然可以将其移至下个月。
【讨论】:
var d = new Date(); d.setDate( d.getDate() + 1 );?
getDate() 会返回那一年的日期。然后,调用setDate 将日期设置为当前年份。所以它不是一个很好的通用解决方案。 @AnthonyWJones's answer 实际上工作正常。
var d = new Date(2015,11,30);d.setDate(d.getDate() + 370) 给出 2017 年 1 月 3 日,跨越 2 年。
你可以创建一个:-
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var date = new Date();
console.log(date.addDays(5));
这会在必要时自动增加月份。例如:
8/31 + 1 天将变为 9/1。
直接使用setDate 的问题在于它是一个mutator,最好避免这种事情。 ECMA 认为将 Date 视为可变类而不是不可变结构是合适的。
【讨论】:
Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
864E5 出于某种原因,我更喜欢在我的代码中写 24*60*60 :)
这些答案让我感到困惑,我更喜欢:
var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);
getTime() 为我们提供自 1970 年以来的毫秒数,而 86400000 是一天中的毫秒数。 因此, ms 包含所需日期的毫秒数。
使用毫秒构造函数给出所需的日期对象。
【讨论】:
new Date(new Date('11/4/2012').getTime() + 86400000)
试试
var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() + (duration * 24 * 60 * 60 * 1000));
使用 setDate() 添加日期并不能解决您的问题,请尝试在 2 月份添加一些天数,如果您尝试向其添加新天数,则不会达到您的预期。
【讨论】:
setDate() 的“二月”问题的证据吗?是不是这个:stackoverflow.com/questions/5497637/…
感谢 Jason 您按预期工作的回答,这是您的代码和 AnthonyWJones 的方便格式的混合:
Date.prototype.addDays = function(days){
var ms = new Date().getTime() + (86400000 * days);
var added = new Date(ms);
return added;
}
【讨论】:
setDate() 的 mozilla 文档并未表明它将处理月末方案。 见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date
setDate()
这就是我在需要添加天数时使用 setTime() 的原因。
【讨论】:
function DaysOfMonth(nYear, nMonth) {
switch (nMonth) {
case 0: // January
return 31; break;
case 1: // February
if ((nYear % 4) == 0) {
return 29;
}
else {
return 28;
};
break;
case 2: // March
return 31; break;
case 3: // April
return 30; break;
case 4: // May
return 31; break;
case 5: // June
return 30; break;
case 6: // July
return 31; break;
case 7: // August
return 31; break;
case 8: // September
return 30; break;
case 9: // October
return 31; break;
case 10: // November
return 30; break;
case 11: // December
return 31; break;
}
};
function SkipDate(dDate, skipDays) {
var nYear = dDate.getFullYear();
var nMonth = dDate.getMonth();
var nDate = dDate.getDate();
var remainDays = skipDays;
var dRunDate = dDate;
while (remainDays > 0) {
remainDays_month = DaysOfMonth(nYear, nMonth) - nDate;
if (remainDays > remainDays_month) {
remainDays = remainDays - remainDays_month - 1;
nDate = 1;
if (nMonth < 11) { nMonth = nMonth + 1; }
else {
nMonth = 0;
nYear = nYear + 1;
};
}
else {
nDate = nDate + remainDays;
remainDays = 0;
};
dRunDate = Date(nYear, nMonth, nDate);
}
return new Date(nYear, nMonth, nDate);
};
【讨论】:
我的简单解决方案是:
nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);
此解决方案没有夏令时问题。此外,您可以添加/子任何年、月、日等的偏移量。
day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);
是正确的代码。
【讨论】:
setDate。
按照下面的主要示例,只是花了很长时间试图弄清楚交易是什么,而不是添加年份。
如果你只想简单地在你拥有的日期上加上 n 天,你最好去:
myDate.setDate(myDate.getDate() + n);
或冗长的版本
var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);
今天/明天的事情令人困惑。通过将当前日期设置为新的日期变量,您将弄乱年份值。如果你从原来的日期开始工作,你就不会。
【讨论】:
我昨晚创建了这些扩展:
您可以传递正值或负值;
示例:
var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);
Date.prototype.addDays = function (num) {
var value = this.valueOf();
value += 86400000 * num;
return new Date(value);
}
Date.prototype.addSeconds = function (num) {
var value = this.valueOf();
value += 1000 * num;
return new Date(value);
}
Date.prototype.addMinutes = function (num) {
var value = this.valueOf();
value += 60000 * num;
return new Date(value);
}
Date.prototype.addHours = function (num) {
var value = this.valueOf();
value += 3600000 * num;
return new Date(value);
}
Date.prototype.addMonths = function (num) {
var value = new Date(this.valueOf());
var mo = this.getMonth();
var yr = this.getYear();
mo = (mo + num) % 12;
if (0 > mo) {
yr += (this.getMonth() + num - mo - 12) / 12;
mo += 12;
}
else
yr += ((this.getMonth() + num - mo) / 12);
value.setMonth(mo);
value.setYear(yr);
return value;
}
【讨论】:
正确答案:
function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
错误答案:
这个答案有时提供了正确的结果,但经常返回错误的年份和月份。此答案唯一有效的时间是您添加天数的日期恰好是当前年份和月份。
// Don't do it this way!
function addDaysWRONG(date, days) {
var result = new Date();
result.setDate(date.getDate() + days);
return result;
}
证明/示例
// Correct
function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
// Bad Year/Month
function addDaysWRONG(date, days) {
var result = new Date();
result.setDate(date.getDate() + days);
return result;
}
// Bad during DST
function addDaysDstFail(date, days) {
var dayms = (days * 24 * 60 * 60 * 1000);
return new Date(date.getTime() + dayms);
}
// TEST
function formatDate(date) {
return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
}
$('tbody tr td:first-child').each(function () {
var $in = $(this);
var $out = $('<td/>').insertAfter($in).addClass("answer");
var $outFail = $('<td/>').insertAfter($out);
var $outDstFail = $('<td/>').insertAfter($outFail);
var date = new Date($in.text());
var correctDate = formatDate(addDays(date, 1));
var failDate = formatDate(addDaysWRONG(date, 1));
var failDstDate = formatDate(addDaysDstFail(date, 1));
$out.text(correctDate);
$outFail.text(failDate);
$outDstFail.text(failDstDate);
$outFail.addClass(correctDate == failDate ? "right" : "wrong");
$outDstFail.addClass(correctDate == failDstDate ? "right" : "wrong");
});
body {
font-size: 14px;
}
table {
border-collapse:collapse;
}
table, td, th {
border:1px solid black;
}
td {
padding: 2px;
}
.wrong {
color: red;
}
.right {
color: green;
}
.answer {
font-weight: bold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
<tbody>
<tr>
<th colspan="4">DST Dates</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>03/10/2013</td></tr>
<tr><td>11/03/2013</td></tr>
<tr><td>03/09/2014</td></tr>
<tr><td>11/02/2014</td></tr>
<tr><td>03/08/2015</td></tr>
<tr><td>11/01/2015</td></tr>
<tr>
<th colspan="4">2013</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2013</td></tr>
<tr><td>02/01/2013</td></tr>
<tr><td>03/01/2013</td></tr>
<tr><td>04/01/2013</td></tr>
<tr><td>05/01/2013</td></tr>
<tr><td>06/01/2013</td></tr>
<tr><td>07/01/2013</td></tr>
<tr><td>08/01/2013</td></tr>
<tr><td>09/01/2013</td></tr>
<tr><td>10/01/2013</td></tr>
<tr><td>11/01/2013</td></tr>
<tr><td>12/01/2013</td></tr>
<tr>
<th colspan="4">2014</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2014</td></tr>
<tr><td>02/01/2014</td></tr>
<tr><td>03/01/2014</td></tr>
<tr><td>04/01/2014</td></tr>
<tr><td>05/01/2014</td></tr>
<tr><td>06/01/2014</td></tr>
<tr><td>07/01/2014</td></tr>
<tr><td>08/01/2014</td></tr>
<tr><td>09/01/2014</td></tr>
<tr><td>10/01/2014</td></tr>
<tr><td>11/01/2014</td></tr>
<tr><td>12/01/2014</td></tr>
<tr>
<th colspan="4">2015</th>
</tr>
<tr>
<th>Input</th>
<th>+1 Day</th>
<th>+1 Day Fail</th>
<th>+1 Day DST Fail</th>
</tr>
<tr><td>01/01/2015</td></tr>
<tr><td>02/01/2015</td></tr>
<tr><td>03/01/2015</td></tr>
<tr><td>04/01/2015</td></tr>
<tr><td>05/01/2015</td></tr>
<tr><td>06/01/2015</td></tr>
<tr><td>07/01/2015</td></tr>
<tr><td>08/01/2015</td></tr>
<tr><td>09/01/2015</td></tr>
<tr><td>10/01/2015</td></tr>
<tr><td>11/01/2015</td></tr>
<tr><td>12/01/2015</td></tr>
</tbody>
</table>
【讨论】:
new Date(); 与new Date(date)。第一个使用当前年、月和日创建;然后改变一天。第二个使用给定年、月、日创建日期,然后更改日期。
我已经使用这种方法在一行中获取正确的日期,以便按照上面人们所说的时间加上一天。
((new Date()).setDate((new Date()).getDate()+1))
我只是想我会建立一个普通的(new Date()):
(new Date()).getDate()
> 21
使用上面的代码,我现在可以在 Date() 中的 (new Date()) 中设置所有这些,并且它的行为正常。
(new Date(((new Date()).setDate((new Date()).getDate()+1)))).getDate()
> 22
或获取Date 对象:
(new Date(((new Date()).setDate((new Date()).getDate()+1))))
【讨论】:
如果可以,请使用moment.js。 JavaScript 没有很好的原生日期/时间方法。以下是 Moment 的语法示例:
var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>
【讨论】:
//the_day is 2013-12-31
var the_day = Date.UTC(2013, 11, 31);
// Now, the_day will be "1388448000000" in UTC+8;
var the_next_day = new Date(the_day + 24 * 60 * 60 * 1000);
// Now, the_next_day will be "Wed Jan 01 2014 08:00:00 GMT+0800"
【讨论】:
我使用类似的东西:
new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)
适用于日节省时间:
new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
适用于新年:
new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
可以参数化:
function DateAdd(source, amount, step) {
var factor = 1;
if (step == "day") factor = 24 * 60 * 60 * 1000;
else if (step == "hour") factor = 60 * 60 * 1000;
...
new Date(source.getTime() + amount * factor);
}
【讨论】:
我总结了小时和天...
Date.prototype.addDays = function(days){
days = parseInt(days, 10)
this.setDate(this.getUTCDate() + days);
return this;
}
Date.prototype.addHours = function(hrs){
var hr = this.getUTCHours() + parseInt(hrs , 10);
while(hr > 24){
hr = hr - 24;
this.addDays(1);
}
this.setHours(hr);
return this;
}
【讨论】:
我不敢相信,在 5 年后,此线程中还没有剪切粘贴的解决方案!
SO:无论夏季干扰如何,都要获得相同的时间:
Date.prototype.addDays = function(days)
{
var dat = new Date( this.valueOf() )
var hour1 = dat.getHours()
dat.setTime( dat.getTime() + days * 86400000) // 24*60*60*1000 = 24 hours
var hour2 = dat.getHours()
if (hour1 != hour2) // summertime occured +/- a WHOLE number of hours thank god!
dat.setTime( dat.getTime() + (hour1 - hour2) * 3600000) // 60*60*1000 = 1 hour
return dat
or
this.setTime( dat.getTime() ) // to modify the object directly
}
那里。完成!
【讨论】:
派对迟到了,但是如果你使用有一个很棒的插件叫做 Moment:jQuery 那么
var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();
http://momentjs.com/docs/#/manipulating/
还有很多其他好东西!
编辑:感谢 aikeru 的评论,删除了 jQuery 参考
【讨论】:
我想我也会给出答案:
就个人而言,我喜欢尝试避免无缘无故的变量声明、方法调用和构造函数调用,因为它们的性能都很昂贵。 (当然在合理范围内)
我本来打算在@AnthonyWJones 给出的答案下发表评论,但我想得更好。
// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
return this.setTime( 864E5 * days + this.valueOf() ) && this;
};
// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
return date.setTime( 864E5 * days + date.valueOf() ) && date;
};
// Basic Function declaration...
function addDaysToDate( date, days ) {
return date.setTime( 864E5 * days + date.valueOf() ) && date;
};
以上将遵守夏令时。这意味着如果您添加跨 DST 的天数,显示的时间(小时)将会改变以反映这一点。
示例:
2014 年 11 月 2 日 02:00 是夏令时结束。
var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt ); // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 09:30:00
如果您希望在 DST 期间保留时间(因此 10:30 仍将是 10:30)...
// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
return this.setDate( this.getDate() + days ) && this;
};
// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
return date.setDate( date.getDate() + days ) && date;
};
// Basic Function declaration...
function addDaysToDate( date, days ) {
return date.setDate( date.getDate() + days ) && date;
};
所以,现在你有...
var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt ); // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 10:30:00
【讨论】:
我知道,但有时我喜欢这样:
function addDays(days) {
return new Date(Date.now() + 864e5 * days);
}
【讨论】:
Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
我正在使用以下解决方案。
var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);
Date 有一个接受 int 的构造函数。此参数表示 1970 年 1 月 1 日之前/之后的总毫秒数。它还有一个方法 setTime,它在不创建新 Date 对象的情况下执行相同的操作。
我们在这里所做的是将天转换为毫秒,并将此值添加到 getTime 提供的值中。最后,我们将结果传递给 Date(milliseconds) 构造函数或 setTime(milliseconds) 方法。
【讨论】:
now.setDate(now.getDate() + days); 自动处理 DST 更改。而且我必须更正,闰秒在 JS 时间戳中被忽略。
编辑:
而不是setTime()(或setHours())你可以这样做:
Date.prototype.addDays= function(d){
this.setDate(this.getDate() + d);
return this;
};
var tomorrow = new Date().addDays(1);
旧:
您可以使用setHours(),而不是使用setTime():
Date.prototype.addDays= function(d){
this.setHours(this.getHours() + d * 24);
return this;
};
var tomorrow = new Date().addDays(1);
见the JSFiddle...
【讨论】:
d.setDate(d.getDate() + 1);
对于那些使用 Angular 的人:
只要做:
$scope.booking.totTijd.setMinutes($scope.booking.totTijd.getMinutes()+15);
$scope.booking.totTijd.setDate($scope.booking.totTijd.getDate() + 1);
【讨论】:
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);
var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);
document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);
【讨论】:
2.39KB 缩小。一份文件。 https://github.com/rhroyston/clock-js
console.log(clock.what.weekday(clock.now + clock.unit.days)); //"wednesday"
console.log(clock.what.weekday(clock.now + (clock.unit.days * 2))); //"thursday"
console.log(clock.what.weekday(clock.now + (clock.unit.days * 3))); //"friday"
<script src="https://raw.githubusercontent.com/rhroyston/clock-js/master/clock.min.js"></script>
【讨论】:
不,javascript 没有内置函数,但是 您可以使用简单的代码行
timeObject.setDate(timeObject.getDate() + countOfDays);
【讨论】:
最简单的解决方案。
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + parseInt(days));
return this;
};
// and then call
var newDate = new Date().addDays(2); //+2 days
console.log(newDate);
// or
var newDate1 = new Date().addDays(-2); //-2 days
console.log(newDate1);
【讨论】:
在 java 脚本中添加日期的非常简单的代码。
var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);
【讨论】:
我在建议的解决方案中遇到了夏令时问题。
通过改用getUTCDate / setUTCDate,我解决了我的问题。
// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
// Make a working copy so we don't mutate the supplied date.
const d = new Date(date);
d.setUTCDate(d.getUTCDate() + num);
return d;
}
【讨论】:
您可以在此处创建自定义帮助函数
function plusToDate(currentDate, unit, howMuch) {
var config = {
second: 1000, // 1000 miliseconds
minute: 60000,
hour: 3600000,
day: 86400000,
week: 604800000,
month: 2592000000, // Assuming 30 days in a month
year: 31536000000 // Assuming 365 days in year
};
var now = new Date(currentDate);
return new Date(now + config[unit] * howMuch);
}
var today = new Date();
var theDayAfterTommorow = plusToDate(today, 'day', 2);
顺便说一句,这是添加秒、分钟或天的通用解决方案。
【讨论】: