如何从普通日期中减去天数?

有没有一种简单的方法可以使用JavaScriptDate(例如今天)并返回X天?

所以,例如,如果我想计算今天前5天的日期。

960747 次浏览

试试这样的东西:

 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());

它是这样的:

var d = new Date(); // today!var x = 5; // go back 5 days!d.setDate(d.getDate() - x);
var dateOffset = (24*60*60*1000) * 5; //5 daysvar myDate = new Date();myDate.setTime(myDate.getTime() - dateOffset);

如果您在整个Web应用程序中执行大量令人头疼的日期操作,DateJS将使您的生活更轻松:

http://simonwillison.net/2007/Dec/3/datejs/

将日期拆分为多个部分,然后返回一个带有调整值的新日期

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);}

请记住,月份是以零为基础的,但天数不是。即new Date(2009,1,1)==2009年2月1日,new Date(2009,1,0)==2009年1月31日;

我为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);
var my date = new Date().toISOString().substring(0, 10);

它只能给你像2014-06-20这样的日期。希望能帮上忙

我注意到getDays+X不适用于日/月边界。只要您的日期不在1970年之前,使用getTime即可。

var todayDate = new Date(), weekDate = new Date();weekDate.setTime(todayDate.getTime()-(7*24*3600000));
var daysToSubtract = 3;$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;

我喜欢在毫秒内做数学。所以使用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)。这里是Polyill

2015年6月更新

正如他/她所说:“一年中的某一天有23个小时,由于时区规则,有25个小时。

为了对此进行扩展,如果您想在具有夏令时更改的时区中计算5天前的本地日,并且您想要计算夏令时,上面的答案将具有夏令时不准确

  • 假设(错误地)Date.now()为您提供当前的LOCAL now时间,或者
  • 使用.toString()返回本地日期,因此与UTC中的Date.now()基准日期不兼容。

但是,如果你在UTC中进行数学运算,它会起作用,例如

A.您想要5天前(UTC)的UTC日期

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTCnew Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B.您以“现在”以外的UTC基准日期开始,使用Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString

一些现有的解决方案很接近,但不完全是我想要的。此函数适用于正值或负值,并处理边界情况。

function addDays(date, days) {return new Date(date.getFullYear(),date.getMonth(),date.getDate() + days,date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds());}

设置日期时,日期转换为毫秒,因此您需要将其转换回日期:

这种方法还考虑到新年变化等。

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) );

moment.js.所有很酷的孩子都使用它。它有更多的格式选项,等等

var n = 5;var dateMnsFive = moment(<your date>).subtract(n , 'day');

可选!转换为JS Date obj进行Angular绑定。

var date = new Date(dateMnsFive.toISOString());

可选!格式

var date = dateMnsFive.format("YYYY-MM-DD");

您可以使用JavaScript。

var CurrDate = new Date(); // Current Datevar 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;

希望对你有帮助。

最上面的答案导致我的代码中有一个bug,在这个月的第一个月,它将在当月设置一个未来的日期。

curDate = new Date(); // Took current date as an exampleprvDate = new Date(0); // Date set to epoch 0prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time

管理日期的简单方法是使用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 datealert(new_date);

文档http://momentjs.com/docs/#/manipulating/add/

var d = new Date();
document.write('Today is: ' + d.toLocaleString());
d.setDate(d.getDate() - 31);
document.write('<br>5 days ago was: ' + d.toLocaleString());

我发现getDate()/setDate()方法的一个问题是它太容易将所有内容转换为毫秒,并且语法有时对我来说很难理解。

相反,我喜欢利用1天=8640万毫秒的事实。

所以,对于你的具体问题:

today = new Date()days = 86400000 //number of milliseconds in a dayfiveDaysAgo = new Date(today - (5*days))

工作就像一个魅力。

我一直使用这种方法进行滚动30/60/365天的计算。

你可以很容易地推断出这一点,以创建几个月、几年等的时间单位。

对我来说,所有的组合都可以很好地使用下面的代码片段,该片段用于Angular-2实现,如果需要添加天数,可以传递正天数,如果需要减去负天数

function addSubstractDays(date: Date, numberofDays: number): Date {let d = new Date(date);return new Date(d.getFullYear(),d.getMonth(),(d.getDate() + numberofDays));}

我喜欢下面的,因为它是一条线。不完美的DST变化,但通常足以满足我的需求。

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));

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);

不使用第二个变量,你可以用你的后x天替换7 for:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))

我从date.js得到了很好的里程:

http://www.datejs.com/

d = new Date();d.add(-10).days();  // subtract 10 days

真棒!

网站包括这个美丽:

Datejs不只是解析字符串,它将它们一分为二

我转换成毫秒并扣除天数,否则月份和年份不会改变并且合乎逻辑

var numberOfDays = 10;//number of days need to deducted or addedvar date = "01-01-2018"// date need to changevar dt = new Date(parseInt(date.substring(6), 10),        // YearparseInt(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();

希望有帮助

如果你想减去天数并以人类可读的格式格式化你的日期,你应该考虑创建一个看起来像这样的自定义DateHelper对象:

var DateHelper = {addDays : function(aDate, numberOfDays) {aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDaysreturn 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 zeroesdate.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));

(另见这个小提琴

我创建了一个日期操作的函数。您可以添加或减去任何天数,小时,分钟。

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, "-");

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 );

使用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 todayvar 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>

使用现代JavaScript函数语法

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));
console.log(getDaysPastDate(1)); // yesterday

试试这样的东西

dateLimit = (curDate, limit) => {offset  = curDate.getDate() + limitreturn new Date( curDate.setDate( offset) )}

currDate可以是任何日期

限制可能是天数的差异(未来为正,过去为负)

这将给你最后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;

您可以根据您的要求更改减去天数

请参阅以下代码,从当前日期中减去天数。此外,根据减去的日期设置月份。

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);

如果你想把它全部放在一条线上。

从今天起5天

//pastvar fiveDaysAgo = new Date(new Date().setDate(new Date().getDate() - 5));//futurevar fiveDaysInTheFuture = new Date(new Date().setDate(new Date().getDate() + 5));

从特定日期起5天

 var pastDate = new Date('2019-12-12T00:00:00');
//pastvar fiveDaysAgo = new Date(new Date().setDate(pastDate.getDate() - 5));//futurevar fiveDaysInTheFuture = 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));

要计算比全天更精确的相对时间戳,可以使用Date.getTime()和Date.setTime()来处理表示自某个纪元(即1970年1月1日)以来的毫秒数的整数。例如,如果你想知道现在之后17小时是什么时候:

const msSinceEpoch = (new Date()).getTime();const fortyEightHoursLater = new Date(msSinceEpoch + 48 * 60 * 60 * 1000).toLocaleString();const fortyEightHoursEarlier = new Date(msSinceEpoch - 48 * 60 * 60 * 1000).toLocaleString();const fiveDaysAgo = new Date(msSinceEpoch - 120 * 60 * 60 * 1000).toLocaleString();
console.log({msSinceEpoch, fortyEightHoursLater, fortyEightHoursEarlier, fiveDaysAgo})

引用

有些人建议在js中处理日期时使用moment.js让你的生活更轻松。自从这些答案以来,时间已经过去了,值得注意的是,moment.js的作者现在不鼓励使用。主要是由于它的大小和缺乏树振动支持。

如果你想走库路线,使用像卢克松这样的替代方案。它要小得多(因为它巧妙地使用了Intl对象并支持树摇动),而且和moment.js.一样通用

从今天起5天回到卢克松,你会做:

import { DateTime } from 'luxon'
DateTime.now().minus({ days: 5 });
function daysSinceGivenDate (date) {const dateInSeconds = Math.floor((new Date().valueOf() - date.valueOf()) / 1000);const oneDayInSeconds = 86400;
return Math.floor(dateInSeconds / oneDayInSeconds); // casted to int};
console.log(daysSinceGivenDate(new Date())); // 0console.log(daysSinceGivenDate(new Date("January 1, 2022 03:24:00"))); // relative...