ChatGPT解决这个技术问题 Extra ChatGPT

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

想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

有没有一种简单的方法来获取 olain JavaScript Date(例如今天)并返回 X 天?

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


R
RobG

尝试这样的事情:

 var d = new Date();
 d.setDate(d.getDate()-5);

请注意,这会修改日期对象并返回更新日期的时间值。

var d = 新日期(); document.write('今天是:' + d.toLocaleString()); d.setDate(d.getDate() - 5); document.write('
5 天前是:' + d.toLocaleString());


它的输出给了我一长串整数。知道如何将其格式化为 2012 年 5 月 14 日吗?
鉴于这是在谷歌的顶部,我想我会回答上面的评论:new Date(new Date().setDate(new Date().getDate()-5)) - 那将是 5 天前。在答案示例中,将其传递给新日期以获取日期对象。所以 new Date(d) 就是你想要的。
这样做的问题是您最终可能会得到 00,这不是日期的有效值。
setDate(-1) 将日期设置为该月的最后一天
@user525146 询问如何格式化数字,而不是数字是什么。没有必要居高临下的回答。要格式化数字,请使用 Date toString 方法之一,例如 toISOStringtoDateString 等。
k
karim79
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小时。这通常没关系,但这是需要考虑的事情。
@Kip我讨厌夏令时......和时区。我们都应该搬到格林威治标准时间。
@cwallenpoole 不要打破你的泡沫,但即使在格林威治他们也使用 DST。因此,如果您真的想使用 GMT,那么您仅限于冰岛和一些西非国家。
这种方法的问题在于它不适用于新年等。
@danielWilliams 这对新的一年怎么不起作用? getTime()setTime() 是自纪元以来的毫秒数。时间是否跨越一年的界限并不重要。
C
Chris Nielsen

它是这样的:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);

它的输出给了我一长串整数。知道如何将其格式化为 2012 年 5 月 14 日吗?
d.setDate 的返回值确实是一个整数值。但是,此时您可能实际上对返回值并不感兴趣,因为“d”的实际值已被修改。您现在真正的问题是如何格式化您的日期,它现在在“d”中,而不是 setDate 的返回值。 (嗯,它实际上是返回值,但它不是那个时候的日期,我不想让你感到困惑——只需使用 d,它会更快)。对于格式化日期,您需要 d.getMonth()、d.getFullYear() 和 d.getDate() 方法。你想给 d.getMonth() 加一,因为 Jan 是 0。
作为一个简单的方法:function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a}; 然后只是 var daysAgo45 = getDaysAgo(45);
@MiroKrsjak 当然,如果您跨过月末/月初,这将有效。为什么它不起作用?
a
awjr

我注意到 getDays+ X 在日/月边界上不起作用。只要您的日期不在 1970 年之前,就可以使用 getTime。

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));

我也注意到了。我更惊讶没有,还是我错过了什么?
这是不正确的, new Date().setDate(-1) 会给你上个月的最后一天。
这在夏令时开始/结束的边缘情况也是不正确的。假设每天有 24 小时,您的方法是减去 7*24 小时。 DST 的第一天只有 23 小时,最后一天是 25 小时。 setDate(getDate()-7) 没有这个问题。
getTime 适用于通用时间。因此将从 Date 对象中正确减去 7 天的时间。当您将其转换为指定时区的字符串时,它将正确显示该时区的时间。
在时间变化的日子要小心。当我们在秋天倒退时,那一天有 25 小时,所以从午夜减去 24 小时将使您在同一天降落。但是,如果您将每次操作后的第二天四舍五入到最近的午夜,这种技术(减去毫秒)将起作用。您可以通过首先添加 12 小时,然后将小时数设置为零来做到这一点。
J
Jonathan Bechtel

我发现 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 天滚动计算。

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


如果使用 TypeScript,则需要为 new Date(today.getTime() - (5*days))
如果代码在凌晨 2 点附近运行并且夏令时在过去 5 天内发生了变化,这可能会给出不正确的结果。
M
Mason Lee

获取 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");

通过将您的日期传递到时刻,您将开始收到警告。弃用警告:提供的值不是可识别的 RFC2822 或 ISO 格式。 moment 构造回退到 js Date(),这在所有浏览器和版本中并不可靠。不鼓励使用非 RFC2822/ISO 日期格式,并将在即将发布的主要版本中删除。有关详细信息,请参阅 momentjs.com/guides/#/warnings/js-date
B
BondAddict

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

从今天起5天

//past
var fiveDaysAgo = new Date(new Date().setDate(new Date().getDate() - 5));
//future
var fiveDaysInTheFuture = new Date(new Date().setDate(new Date().getDate() + 5));

从特定日期起 5 天

 var pastDate = new Date('2019-12-12T00:00:00');

 //past
 var fiveDaysAgo = new Date(new Date().setDate(pastDate.getDate() - 5));
 //future
 var fiveDaysInTheFuture = new Date(new Date().setDate(pastDate.getDate() + 5));

我写了一个你可以使用的函数。

函数 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('今天:' + 新日期()); console.log('Future : ' + AddOrSubractDays(new Date(), 5, true)); console.log('过去:' + AddOrSubractDays(new Date(), 5, false));


欢迎来到 Stack Overflow _ 尽管您已经给出了一个很好的编码答案,但顶部的评论帖子(黄色背景)特别指出“提供一些解释和上下文”是必需的和“解释为什么你的答案是正确的,最好是引用”_请根据上述要求编辑您的答案
代码片段的前 3 行不应该是“fiveDaysAgo”和“fiveDaysIntheFuture”吗?
@MartinKomischke 你是对的。在我实际使用它工作的地方复制粘贴时,我一定错过了这一点。接得好!
你不需要 add 参数,如果你想减去只需传递 -5 就是这样:)
J
Joel Fillmore

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

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

如果我使用这种方法将 20 天添加到本月的 15 日,它会“溢出”到下个月吗?它似乎没有。
@Bora - 是的,如有必要,它会正确增加月份。例如,将 20 天添加到 8 月 15 日: addDays(new Date(2015, 07, 15), 20) 将返回“Fri Sep 04 2015 00:00:00 GMT-0700 (PDT)”
R
Rob Dawley

我为 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)days 的正值和负值一起使用,以分别增加和减少天数。它应该在实例上工作(就像其他 Date 方法一样),而不是创建和返回副本。
C
Cody Gray

在不使用第二个变量的情况下,您可以将 7 替换为您的 x 天:

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

我在另一个条目上对此发表了评论,但这里也适用:由于时间调整,并非所有天都是 86.4m 毫秒。这可能会使结果失真 +/- 1 天
p
poshest

我喜欢以毫秒为单位做数学。所以使用 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 here

2015 年 6 月更新

@socketpair 指出了我的马虎。正如她/他所说的“一年中的某一天有 23 小时,而由于时区规则,有 25 小时”。

为了对此进行扩展,如果您想在夏令时更改的时区中计算 5 天前的本地日期,并且您

假设(错误地) Date.now() 给你当前的本地现在时间,或者

使用 .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. 您从“现在”以外的 UTC 基准日期开始,使用 Date.UTC()

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

这并不精确。一年中的某一天有 23 小时,而由于时区规则,有些天有 25 小时。
当有闰秒时,我会担心失败情况......所以可能对关键代码不利。
J
Joshua

将您的日期分成几部分,然后返回一个带有调整值的新日期

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 日吗?或者你确定这总是正确地结束到适当的月份和/或年份?
使用它来添加 addDays、addMonths 和 addYears 到 Date.prototype。很好很简单。
这应该是正确的答案 - 即使在接受答案失败的一年中的最后一天也可以使用。
不适用于年份从 1 到 99 的日期。;-) 最好只使用 get* 和 set* 方法。
C
Constantin

有人建议在 js 中处理日期时使用 moment.js 让你的生活更轻松。自这些答案以来已经过去了一段时间,值得注意的是,the authors of moment.js now discourage its use。主要是由于它的大小和缺乏摇树支持。

如果您想走图书馆路线,请使用 Luxon 之类的替代方案。它明显更小(因为它巧妙地使用了 Intl object 并支持摇树),并且与 moment.js 一样通用。

从今天起回到 Luxon 的 5 天,您可以:

import { DateTime } from 'luxon'

DateTime.now().minus({ days: 5 });

P
Petr Makarov

函数 addDays (date, daysToAdd) { var _24HoursInMilliseconds = 86400000; return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds); }; var now = new Date(); var 昨天 = addDays(now, - 1); var 明天 = addDays(now, 1);


R
Rahul

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

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

这在 99.9% 的情况下可能无关紧要,但由于时间调整,并非所有天都是 8640 万毫秒。这可能会使结果失真 +/- 1 天
M
Malvi Panchal

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

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

U
UtkarshPramodGupta

使用 MomentJS。

function getXDaysBeforeDate(referenceDate, x) { return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a'); } var yourDate = new Date(); // 假设今天 var valueOfX = 7; // 假设在 console.log(getXDaysBeforeDate(yourDate, valueOfX)) 前 7 天


K
Kishore Avineni

最佳答案导致了我的代码中的一个错误,即在本月的第一天,它将在当前月份设置未来日期。这是我所做的,

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

S
ScottE

我喜欢以下内容,因为它是一行。 DST 更改并不完美,但通常足以满足我的需求。

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

J
Juan Caicedo

管理日期的一种简单方法是使用 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/


M
Mr.Web

对我来说,所有组合都适用于以下代码片段,该片段适用于 Angular-2 实现,如果您需要添加天数,则传递正数天数,如果您需要减去负数天数

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

B
Bret Weinraub

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

http://www.datejs.com/

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

好的!

网站包括这个美丽:

Datejs 不只是解析字符串,它会将它们干净地分成两部分


J
John Slegers

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

var DateHelper = { addDays : function(aDate, numberOfDays) { aDate.setDate(aDate.getDate() + numberOfDays); // 添加 numberOfDays return aDate; // 返回日期 }, format : function format(date) { return [ ("0" + date.getDate()).slice(-2), // 获取日期并用零填充 ("0" + ( date.getMonth()+1)).slice(-2), // 获取月份并用零填充 date.getFullYear() // 获取全年 ].join('/'); // 将各个部分粘合在一起 } } // 有了这个帮助程序,您现在只需使用一行可读代码即可: // ---------------------- ----------------------------------------------------------- // 1 . 获取当前日期 // 2. 减去 5 天 // 3. 格式化 // 4. 输出 // ------------------------ --------------------------------------------- document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(另见this Fiddle


v
vdegenne

使用现代 JavaScript 函数语法

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


I
Ismail

要计算比全天更精确的相对时间戳,可以使用 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})

reference


G
Gabriel Arghire
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())); // 0
console.log(daysSinceGivenDate(new Date("January 1, 2022 03:24:00"))); // relative...

D
Daniel Williams

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

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

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

P
Phoenix

您可以使用 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;

希望它会帮助你。


h
hemanjosko

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

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

希望有所帮助


b
belal ahmad

var date = new Date(); var day = date.getDate(); var mnth = date.getMonth() + 1; var fDate = day + '/' + mnth + '/' + date.getFullYear(); document.write('今天是:' + fDate); var subDate = date.setDate(date.getDate() - 1); var todate = new Date(subDate); var 今天 = todate.getDate(); var tomnth = todate.getMonth() + 1; var endDate = 今天 + '/' + tomnth + '/' + todate.getFullYear(); document.write('
1 天前是:' + endDate );


你应该总是评论你的代码/答案,因为有些人可能不明白你在做什么