有人知道一个简单的约会日期(例如今天)并回溯X天的方法吗?
例如,如果我想计算今天之前5天的日期。
#1 楼
请尝试这样的操作: var d = new Date();
d.setDate(d.getDate()-5);
请注意,这会修改日期对象并返回更新日期的时间值。
var d = new Date();
document.write('Today is: ' + d.toLocaleString());
d.setDate(d.getDate() - 5);
document.write('<br>5 days ago was: ' + d.toLocaleString());
评论
输出的结果是一长串整数。是否知道如何将其格式化为05/14/2012?
–user525146
2012年5月14日21:12
鉴于这是google的顶部,我想回答一下上面的评论:new Date(new Date()。setDate(new Date()。getDate()-5))-这将是5天前。在答案示例中,将其传递给新日期以获取日期对象。因此,新的Date(d)是您想要的。
–杰西
2012年10月15日19:11
问题在于,您可能会以00结束,这不是日期的有效值。
– DominicM
13年7月7日在17:54
setDate(-1)将日期设置为该月的最后一天
–彼得
2014-6-5 14:37
@ user525146询问如何格式化数字,而不是数字。无需居高临下的答案。要格式化数字,请使用Date toString方法之一,例如toISOString,toDateString等。
–错误请求
15年2月2日,19:26
#2 楼
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);
如果您在整个Web应用程序中执行很多头痛检查日期操作,DateJS将使您的生活更加轻松:
http://simonwillison.net/2007/ Dec / 3 / datejs /
评论
这是一个极端的情况,但是在夏时制开始/结束时可能会失败。您不会减去5天,而是5 * 24小时。夏令时的第一天只有23小时长,最后一天是25小时长。通常并不重要,但这是需要考虑的事情。
–基普
09年8月18日在20:55
@Kip我讨厌夏令时...和时区。我们都应该转向格林尼治标准时间。
–wallenpoole
2015年9月30日19:52
@cwallenpoole不会破坏您的泡沫,但即使在格林威治,他们也使用DST。因此,如果您真的想参加格林尼治标准时间(GMT),则仅限于冰岛和一些西非国家/地区。
–基普
2015年10月1日在20:11
这种方法的问题是,它不适用于新年等。
–丹尼尔·威廉姆斯(Daniel Williams)
16年1月13日在8:50
@danielWilliams新年怎么办? getTime()和setTime()是自纪元以来的毫秒数。时间是否跨过年份边界并不重要。
–马什加
19-2-19在14:52
#3 楼
它是这样的:var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
评论
输出的结果是一长串整数。是否知道如何将其格式化为05/14/2012?
–user525146
2012年5月14日在21:11
d.setDate的返回值确实是一个整数值。但是,此时您可能实际上对返回值不感兴趣,因为已修改了“ d”的实际值。您真正的问题是现在如何格式化日期,日期现在是“ d”,而不是setDate的返回值。 (好吧,它实际上是返回值,但是到那时它还不是一个日期,并且我不想让您感到困惑-只需使用d,它将更快。)要格式化日期,您需要d.getMonth(),d.getFullYear()和d.getDate()方法。您要向d.getMonth()添加一个,因为Jan是0。
–克里斯·尼尔森(Chris Nielsen)
2012年5月14日23:00
作为一种简单的方法:函数getDaysAgo(b){var a = new Date; a.setDate(a.getDate()-b); return a};然后只是var daysAgo45 = getDaysAgo(45);
– SpYk3HH
2015年5月6日18:53
@MiroKrsjak当然,如果您越过月底/月初,这将起作用。为什么不起作用?
–克里斯·尼尔森(Chris Nielsen)
19年6月29日在1:33
#4 楼
我注意到getDays + X在日期/月份范围内不起作用。只要您的日期不在1970年之前,就可以使用getTime。var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));
评论
我注意到了。我更惊讶的是没有,或者我想念什么吗?
– Sean Glover
2014年8月25日在20:34
这是不正确的,新的Date()。setDate(-1)将为您提供上个月的最后一天。
–zbrunson
2014-09-16 20:32
在夏令时开始/结束的极端情况下,这也是不正确的。假设每天有24小时,则您的方法将减去7 * 24小时。 DST的第一天只有23小时,而最后一天是25小时。 setDate(getDate()-7)没有此问题。
–基普
2015年10月1日下午13:51
getTime适用于通用时间。因此,可以从Date对象中正确减去7天的时间。当您将其转换为指定时区的字符串时,它将正确显示该时区的时间。
–awjr
2015年10月2日,14:40
更改时间当天要小心。当我们跌倒时,那一天有25个小时,因此从午夜减去24个小时将使您在同一天着陆。但是,如果您在每次操作后的第二天四舍五入到最近的午夜,则此技术(减去毫秒)将起作用。您可以先添加12小时,然后再将小时设置为零来做到这一点。
–神奇
17年4月4日在15:12
#5 楼
获取moment.js。所有很酷的孩子都在使用它。它具有更多的格式设置选项,等等。其中var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');
可选!转换为JS日期obj以进行角度绑定。
var date = new Date(dateMnsFive.toISOString());
可选!格式
var date = dateMnsFive.format("YYYY-MM-DD");
评论
将您的日期传递给当下,您将开始收到警告。弃用警告:提供的值不是公认的RFC2822或ISO格式。此刻的构建工作归结于js Date(),它在所有浏览器和版本之间都不可靠。不建议使用非RFC2822 / ISO日期格式,并将在即将发布的主要版本中将其删除。有关更多信息,请参考momentjs.com/guides/#/warnings/js-date。
–开关
19/12/26在12:30
#6 楼
我为Date设计了这个原型,以便可以传递负值减去天数,传递正值添加天数。if(!Date.prototype.adjustDate){
Date.prototype.adjustDate = function(days){
var date;
days = days || 0;
if(days === 0){
date = new Date( this.getTime() );
} else if(days > 0) {
date = new Date( this.getTime() );
date.setDate(date.getDate() + days);
} else {
date = new Date(
this.getFullYear(),
this.getMonth(),
this.getDate() - Math.abs(days),
this.getHours(),
this.getMinutes(),
this.getSeconds(),
this.getMilliseconds()
);
}
this.setTime(date.getTime());
return this;
};
}
因此,要使用它,我可以简单地写:
var date_subtract = new Date().adjustDate(-4),
date_add = new Date().adjustDate(4);
评论
您可以将d.setDate(d.getDate()+ days)与正值和负值一起使用,以分别增加和减少天数。并且它应该在实例上工作(就像其他Date方法一样),而不是创建并返回副本。
–RobG
18-09-26在2:36
#7 楼
一些现有的解决方案已经接近,但与我想要的不完全相同。此函数可使用正值或负值,并处理边界情况。function addDays(date, days) {
return new Date(
date.getFullYear(),
date.getMonth(),
date.getDate() + days,
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
);
}
评论
如果我使用此方法在当月的15号加上20天,它会“溢出”到下个月吗?似乎没有。
–博拉
15年8月14日在11:17
@Bora-是的,如果需要,它可以正确地增加月份。例如,将20天添加到8月15日:addDays(new Date(2015,07,15),20)将返回“ Fri Sep 04 2015 00:00:00 GMT-0700(PDT)”
–乔尔·菲尔莫(Joel Fillmore)
15年8月29日在19:16
#8 楼
我发现getDate()/ setDate()方法存在一个问题,即它太容易将所有内容转换为毫秒,并且有时我很难遵循其语法。相反,我喜欢解决1天= 86,400,000毫秒的事实。
因此,对于您的特定问题:
today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))
就像一个护身符。
我一直在使用这种方法进行30/60/365天的滚动计算。
您可以轻松地推断出此方法以创建几个月,几年等的时间单位。
#9 楼
我喜欢以毫秒为单位进行数学运算。因此,请使用Date.now()
var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds
,如果您喜欢格式化的格式
new Date(newDate).toString(); // or .toUTCString or .toISOString ...
注意:
Date.now()
不起作用在较旧的浏览器中(例如,我认为是IE8)。 Polyfill在这里。2015年6月更新
@socketpair指出了我的草率。正如他/她所说:“一年中的某天有23个小时,而由于时区规则,则有25个小时。”
要进一步说明,在您想要的情况下,上面的答案将存在夏令时错误计算夏令时所在时区中5天前的本地日期,您
(错误地)假设
Date.now()
给您当前的当前LOCAL时间,或者使用
.toString()
返回当地日期,因此与UTC中的Date.now()
基本日期不兼容。 但是,如果您全部使用UTC进行数学运算,例如
A,它就可以工作。您想从现在(UTC)5天前开始UTC日期
var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString
B。使用
Date.UTC()
newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
,从UTC基本日期(不是“ now”)开始。
评论
这不准确。根据时区规则,一年中的某天有23个小时,而有些则有25个小时。
–套接字对
2015年5月29日在17:17
当出现leap秒时,我会担心故障情况……因此对于关键代码可能不好。
–robocat
2015年9月23日2:00在
#10 楼
将您的日期分成几部分,然后返回具有调整后值的新日期。function DateAdd(date, type, amount){
var y = date.getFullYear(),
m = date.getMonth(),
d = date.getDate();
if(type === 'y'){
y += amount;
};
if(type === 'm'){
m += amount;
};
if(type === 'd'){
d += amount;
};
return new Date(y, m, d);
}
请记住,月份是从零开始的,但日期不是从零开始的。例如,新日期(2009,1,1)== 2009年2月1日,新日期(2009,1,0)== 2009年1月31日;
评论
如果您以这种方式向日期添加例如50天会怎样?它将日期定为2009年8月68日吗?还是确定这总是正确地包装到适当的月份和/或年份?
–杰斯珀
09年8月18日在22:06
用于将addDays,addMonths和addYears添加到Date.prototype。漂亮又简单。
– Scott Isaacs
13年5月29日在0:11
这应该是正确的答案-即使在接受的答案失败的一年的最后一天也可以使用。
–kris
2015年10月19日在7:20
不适用于年份从1到99的日期。;-)最好只使用get *和set *方法。
–RobG
18-09-26在2:38
#11 楼
无需使用第二个变量,您可以将x替换为x天:let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
#12 楼
function addDays (date, daysToAdd) {
var _24HoursInMilliseconds = 86400000;
return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};
var now = new Date();
var yesterday = addDays(now, - 1);
var tomorrow = addDays(now, 1);
#13 楼
我创建了一个用于日期操作的函数。您可以添加或减去任何天数,小时数,分钟数。function dateManipulation(date, days, hrs, mins, operator) {
date = new Date(date);
if (operator == "-") {
var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
var newDate = new Date(date.getTime() - durationInMs);
} else {
var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
var newDate = new Date(date.getTime() + durationInMs);
}
return newDate;
}
现在,通过传递参数来调用此函数。例如,这是一个函数调用,用于从今天起3天之前获取日期。
var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");
#14 楼
使用MomentJS。
function getXDaysBeforeDate(referenceDate, x) {
return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}
var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before
console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
#15 楼
请参见以下代码,从当前日期中减去天数。另外,根据减去的日期设置月份。var today = new Date();
var substract_no_of_days = 25;
today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();
alert(substracted_date);
#16 楼
最佳答案导致我的代码出现错误,该错误将在本月的第一天设置当前月份的将来日期。这是我所做的,curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time
#17 楼
管理日期的一种简单方法是使用Moment.js。您可以使用
add
。示例var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);
文档http://momentjs.com/docs/#/manipulating/add/
#18 楼
我喜欢以下内容,因为它是一行。 DST更改并不完美,但通常足以满足我的需求。var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
#19 楼
对我来说,所有组合都可以在下面的代码片段中正常运行,该片段适用于Angular-2实现,
如果需要添加天数,则传递正数numberofDays,如果需要减去负数传递数numberofDays
function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
d.getFullYear(),
d.getMonth(),
(d.getDate() + numberofDays)
);
}
#20 楼
我从date.js取得了不错的成绩:http://www.datejs.com/
d = new Date();
d.add(-10).days(); // subtract 10 days
很好! >
该网站包括以下功能:
Datejs不仅解析字符串,还将它们清晰地切成两段
#21 楼
如果要同时减去天数并以易于理解的格式设置日期格式,则应考虑创建一个自定义的DateHelper
对象,该对象看起来像这样: var DateHelper = {
addDays : function(aDate, numberOfDays) {
aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
return aDate; // Return the date
},
format : function format(date) {
return [
("0" + date.getDate()).slice(-2), // Get day and pad it with zeroes
("0" + (date.getMonth()+1)).slice(-2), // Get month and pad it with zeroes
date.getFullYear() // Get full year
].join('/'); // Glue the pieces together
}
}
// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));
(另请参阅此小提琴)
#22 楼
设置日期时,日期会转换为毫秒,因此您需要将其转换回日期:该方法还考虑到了新的一年等。
function addDays( date, days ) {
var dateInMs = date.setDate(date.getDate() - days);
return new Date(dateInMs);
}
var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );
#23 楼
您可以使用Javascript。var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today
对于PHP,
$date = date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;
希望对您有所帮助。
#24 楼
我转换为毫秒,并扣除了天,否则月份和年份将不会改变且合乎逻辑。var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10), // Year
parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();
希望有所帮助
#25 楼
var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;
var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );
评论
您应该始终注释您的代码/答案,因为有些人可能无法理解您所做的事情
–迈克尔
18年7月17日在13:09
#26 楼
使用现代JavaScript函数语法 const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));
console.log(getDaysPastDate(1)); // yesterday
#27 楼
尝试类似这样的操作dateLimit = (curDate, limit) => {
offset = curDate.getDate() + limit
return new Date( curDate.setDate( offset) )
}
limit可以是天数之差(未来为正,过去)
#28 楼
这将为您提供最后10天的工作结果,即110%正常工作不会出现任何问题。var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;
您可以根据需要更改减去天数
#29 楼
如果您希望全部都放在一行上。从今天起5天
//past
var thirtyDaysAgo = new Date(new Date().setDate(new Date().getDate() - 5));
//future
var thirtyDaysInTheFuture = new Date(new Date().setDate(new Date().getDate() + 5));
从特定日期起5天
var pastDate = new Date('2019-12-12T00:00:00');
//past
var thirtyDaysAgo = new Date(new Date().setDate(pastDate.getDate() - 5));
//future
var thirtyDaysInTheFuture = new Date(new Date().setDate(pastDate.getDate() + 5));
我写了一个可以使用的函数。
function AddOrSubractDays(startingDate, number, add) {
if (add) {
return new Date(new Date().setDate(startingDate.getDate() + number));
} else {
return new Date(new Date().setDate(startingDate.getDate() - number));
}
}
console.log('Today : ' + new Date());
console.log('Future : ' + AddOrSubractDays(new Date(), 5, true));
console.log('Past : ' + AddOrSubractDays(new Date(), 5, false));
评论
欢迎来到Stack Overflow _尽管您给出了很好的编码答案,但顶部(黄色背景)的评论栏特别指出“需要提供一些解释和上下文”,并且“说明您的答案正确无误,理想情况下使用引文” _请根据以上要求编辑答案
–inputforcolor
19年11月13日在0:05
#30 楼
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
评论
使用公认的答案,我发现了问题。显然,在setDate()中使用负值无法正常工作。请参阅stackoverflow.com/a/9037132/792287,以获取其他(更好的)解决方案。可能重复:stackoverflow.com/questions/1187824/…
检查github.com/viebig/datetreta