Trừ ngày kể từ ngày trong JavaScript


603

Có ai biết một cách dễ dàng để hẹn hò (ví dụ Hôm nay) và quay lại X ngày không?

Vì vậy, ví dụ, nếu tôi muốn tính ngày 5 ngày trước ngày hôm nay.


4
Tôi tìm thấy vấn đề bằng cách sử dụng câu trả lời được chấp nhận. Rõ ràng việc sử dụng các giá trị âm trong setDate () không hoạt động như mong đợi. Xem stackoverflow.com/a/9037132/792287 để biết giải pháp khác (tốt hơn?).
vandiedakaf


Câu trả lời:


961

Hãy thử một cái gì đó như thế này:

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

Lưu ý rằng điều này sửa đổi đối tượng ngày và trả về giá trị thời gian của ngày cập nhật.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());


9
Đầu ra của nó cho tôi một chuỗi số nguyên dài. Bất kỳ ý tưởng làm thế nào để định dạng nó vào 14/05/2012?
user525146

162
Cho rằng đây là ưu tiên hàng đầu của google, tôi cho rằng tôi sẽ trả lời nhận xét trên: new Date(new Date().setDate(new Date().getDate()-5))- đó sẽ là 5 ngày trước. Trong ví dụ về câu trả lời, chuyển nó sang một ngày mới để có được một đối tượng ngày. Vì vậy, new Date(d)là những gì bạn muốn.
Jesse

8
Vấn đề với điều này là bạn có thể kết thúc với 00 không phải là giá trị hợp lệ cho ngày.
Đaminh

24
setDate(-1)sẽ đặt ngày đến ngày cuối cùng của tháng
Peter

5
@ user525146 hỏi cách định dạng số chứ không phải số đó là gì. Không cần câu trả lời hạ thấp. Để định dạng số, người ta sử dụng ngày toStringcác phương pháp như toISOString, toDateStringvv
Bad Request

83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Nếu bạn đang thực hiện nhiều thao tác ngày khó khăn trong ứng dụng web của mình, DateJS sẽ giúp cuộc sống của bạn dễ dàng hơn nhiều:

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


23
đó là một trường hợp cạnh, nhưng điều này có thể thất bại trong khoảng thời gian bắt đầu / kết thúc tiết kiệm ánh sáng ban ngày. bạn không trừ 5 ngày, nhưng 5 * 24 giờ. ngày đầu tiên của thời gian tiết kiệm ánh sáng ban ngày chỉ dài 23 giờ và ngày cuối cùng là 25 giờ. nó thường không thành vấn đề, nhưng đó là điều cần xem xét.
Kip

11
@Kip Tôi ghét thời gian tiết kiệm ánh sáng ban ngày ... và múi giờ. Tất cả chúng ta nên chuyển sang GMT.
cwallenpoole

6
@cwallenpoole không làm vỡ bong bóng của bạn, nhưng họ sử dụng DST ngay cả ở Greenwich. Vì vậy, nếu bạn thực sự muốn có mặt trên GMT, bạn bị giới hạn ở Iceland và một số quốc gia Tây Phi.
Kip

1
Vấn đề với phương pháp này là nó không hoạt động với năm mới, v.v.
Daniel Williams

4
@danielWilliams Làm thế nào điều này không làm việc với một năm mới? getTime()setTime()là mili giây kể từ kỷ nguyên. Nó không quan trọng nếu thời gian vượt qua một ranh giới năm.
Mashmagar

52

Nó đi một cái gì đó như thế này:

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

Đầu ra của nó cho tôi một chuỗi số nguyên dài. Bất kỳ ý tưởng làm thế nào để định dạng nó vào 14/05/2012?
user525146

7
Giá trị trả về của d.setDate thực sự là một giá trị nguyên. Tuy nhiên, có lẽ bạn không thực sự quan tâm đến giá trị trả về tại thời điểm này, vì giá trị thực của "d" đã được sửa đổi. Câu hỏi thực sự của bạn bây giờ là làm thế nào để định dạng ngày của bạn, giờ là "d" chứ không phải giá trị trả về của setDate. (Chà, nó thực sự là giá trị trả về, nhưng nó không phải là một ngày vào thời điểm đó và tôi không muốn làm bạn bối rối - chỉ cần sử dụng d, nó sẽ nhanh hơn). Để định dạng ngày, bạn muốn các phương thức d.getMonth (), d.getFullYear () và d.getDate (). Bạn muốn thêm một vào d.getMonth (), vì tháng 1 là 0.
Chris Nielsen

2
Như một phương pháp đơn giản: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};sau đó chỉ làvar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak Tất nhiên điều này hoạt động nếu bạn vượt qua cuối tháng / đầu. Tại sao nó không hoạt động?
Chris Nielsen

23

Tôi nhận thấy rằng getDays + X không hoạt động trên ranh giới ngày / tháng. Sử dụng getTime hoạt động miễn là ngày của bạn không trước năm 1970.

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

3
Tôi nhận thấy như vậy. Tôi ngạc nhiên hơn không, hoặc tôi đang thiếu một cái gì đó?
Sean Glover

11
Điều này không chính xác, Ngày mới (). SetDate (-1) sẽ cung cấp cho bạn ngày cuối cùng của tháng trước.
zbrunson

2
Điều này cũng không chính xác xung quanh trường hợp bắt đầu / kết thúc thời gian tiết kiệm ánh sáng ban ngày. Cách tiếp cận của bạn đang trừ 7 * 24 giờ, với giả định rằng mỗi ngày có 24 giờ. Ngày đầu tiên của DST chỉ dài 23 giờ và ngày cuối cùng dài 25 giờ. setDate (getDate () - 7) không có vấn đề này.
Kip

1
getTime hoạt động ngoài giờ phổ quát. Vì vậy, sẽ trừ chính xác thời gian 7 ngày từ đối tượng Date. Khi bạn chuyển đổi nó thành một chuỗi trong múi giờ đã chỉ định, nó sẽ hiển thị chính xác thời gian cho vùng đó.
awjr

Hãy cẩn thận vào ngày thay đổi thời gian. Khi chúng tôi rơi trở lại vào mùa thu, ngày đó có 25 giờ, vì vậy trừ đi 24 giờ kể từ nửa đêm sẽ hạ cánh bạn trong cùng một ngày. Nhưng kỹ thuật này (trừ mili giây) S work hoạt động nếu bạn làm tròn ngày sau mỗi thao tác đến nửa đêm gần nhất. Bạn có thể làm điều đó bằng cách trước tiên thêm 12 giờ, sau đó đặt giờ thành không.
Magmatic

18

có được khoảnh khắc.js. Tất cả những đứa trẻ mát mẻ sử dụng nó. Nó có nhiều tùy chọn định dạng hơn, v.v.

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

Không bắt buộc! Chuyển đổi sang JS Ngày obj cho ràng buộc Angular.

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

Không bắt buộc! định dạng

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

bằng cách chuyển ngày của bạn vào khoảnh khắc, bạn sẽ bắt đầu nhận được cảnh báo. Cảnh báo khấu hao: giá trị được cung cấp không ở định dạng RFC2822 hoặc ISO được công nhận. thời điểm xây dựng rơi trở lại js Date (), không đáng tin cậy trên tất cả các trình duyệt và phiên bản. Các định dạng ngày không RFC2822 / ISO không được khuyến khích và sẽ bị xóa trong một bản phát hành chính sắp tới. Vui lòng tham khảo khoảnh khắc js.com/guides/#/warnings/js-date để biết thêm thông tin.
Chuyển

13

Tôi đã tạo nguyên mẫu này cho Ngày để tôi có thể chuyển các giá trị âm để trừ ngày và giá trị dương để thêm ngày.

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

Vì vậy, để sử dụng nó tôi có thể chỉ cần viết:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);

2
Bạn có thể sử dụng d.setDate(d.getDate() + days)với cả giá trị dương và âm trong nhiều ngày để cộng và trừ ngày tương ứng. Và nó nên hoạt động trên ví dụ (như các phương thức Date khác làm), không tạo và trả về một bản sao.
RobG

13

Một vài trong số các giải pháp hiện có đã gần, nhưng không hoàn toàn chính xác những gì tôi muốn. Hàm này hoạt động với cả giá trị dương hoặc âm và xử lý các trường hợp biên.

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

2
nó có 'tràn' sang tháng tới không nếu tôi sử dụng phương pháp này để thêm 20 ngày vào ngày 15 của tháng hiện tại? Nó dường như không.
Bora

2
@Bora - vâng, nó tăng đúng tháng nếu cần thiết. Ví dụ: thêm 20 ngày vào ngày 15 tháng 8: addDays (Ngày mới (2015, 07, 15), 20) sẽ trở lại "Thứ Sáu ngày 04 tháng 9 năm 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore

12

Tôi thích làm toán trong một phần nghìn giây. Vì vậy, sử dụngDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

và nếu bạn thích nó được định dạng

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

LƯU Ý: Date.now()không hoạt động trong các trình duyệt cũ hơn (ví dụ IE8 tôi nghĩ). Polyfill đây .

CẬP NHẬT tháng 6 năm 2015

@socket Pair chỉ ra sự cẩu thả của tôi. Như ông / ông nói "Một ngày nào đó trong năm có 23 giờ và khoảng 25 do quy tắc múi giờ".

Để mở rộng về điều đó, câu trả lời ở trên sẽ có sự thiếu chính xác về ánh sáng ban ngày trong trường hợp bạn muốn tính toán LỘC 5 ngày trước trong một múi giờ với thay đổi ánh sáng ban ngày và bạn

  • giả sử (sai) Date.now()cung cấp cho bạn ĐỊA PHƯƠNG hiện tại, hoặc
  • sử dụng .toString()trả về ngày cục bộ và do đó không tương thích với Date.now()ngày cơ sở trong UTC.

Tuy nhiên, nó hoạt động nếu bạn đang làm toán hoàn toàn bằng UTC, vd

A. Bạn muốn ngày UTC 5 ngày trước từ NOW (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. Bạn bắt đầu với ngày cơ sở UTC khác với "ngay bây giờ", bằng cách sử dụng Date.UTC()

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

3
Điều này không chính xác. Một số ngày trong năm có 23 giờ và 25 do quy tắc múi giờ.
tuyệt vọng

Tôi sẽ lo lắng về các điều kiện thất bại khi có những giây nhuận ... vì vậy có lẽ không tốt cho mã quan trọng.
robocat

12

Tôi thấy một vấn đề với phương thức getDate () / setDate () là nó quá dễ dàng biến mọi thứ thành mili giây và cú pháp đôi khi rất khó để tôi làm theo.

Thay vào đó, tôi thích làm việc với thực tế là 1 ngày = 86.400.000 mili giây.

Vì vậy, đối với câu hỏi cụ thể của bạn:

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

Hoạt động như một lá bùa.

Tôi sử dụng phương pháp này mọi lúc để thực hiện các phép tính 30/60/365 ngày.

Bạn có thể dễ dàng ngoại suy điều này để tạo ra các đơn vị thời gian trong nhiều tháng, nhiều năm, v.v.


11

chia ngày của bạn thành nhiều phần, sau đó trả lại một Ngày mới với các giá trị được điều chỉnh

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

Hãy nhớ rằng các tháng là không dựa trên, nhưng ngày thì không. tức là Ngày mới (2009, 1, 1) == 01 tháng 2 năm 2009, Ngày mới (2009, 1, 0) == 31 tháng 1 năm 2009;


2
Điều gì xảy ra nếu bạn thêm ví dụ 50 ngày vào một ngày theo cách này? Nó sẽ đặt ngày đến 68 tháng 8 năm 2009? Hoặc bạn có chắc chắn rằng điều này luôn luôn kết thúc đúng tháng và / hoặc năm thích hợp?
Jesper

Đã sử dụng điều này để thêm addDays, addMonths và addYears vào Date.prototype. Đẹp và đơn giản.
Scott Isaacs

1
Đây phải là câu trả lời chính xác - nó hoạt động ngay cả vào ngày cuối cùng của năm khi câu trả lời được chấp nhận không thành công.
kris

Không hoạt động cho các ngày có năm từ 1 đến 99. ;-) Tốt hơn nhiều là chỉ sử dụng các phương thức get *set * .
RobG

8

Không sử dụng biến thứ hai, bạn có thể thay thế 7 cho trở lại x ngày của mình:

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

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


2

Tôi đã tạo ra một chức năng để thao tác ngày. bạn có thể thêm hoặc bớt bất kỳ số ngày, giờ, phút.

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

Bây giờ, gọi hàm này bằng cách truyền tham số. Ví dụ, đây là một cuộc gọi chức năng để nhận được ngày trước 3 ngày kể từ hôm nay.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

2

Sử dụng 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>


1

Các câu trả lời hàng đầu đã dẫn đến một lỗi trong mã của tôi, trong đó vào ngày đầu tiên của tháng, nó sẽ đặt một ngày trong tương lai trong tháng hiện tại. Đây là những gì tôi đã làm,

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


0

Tôi thích sau đây vì nó là một dòng. Không hoàn hảo với những thay đổi DST nhưng thường đủ tốt cho nhu cầu của tôi.

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

0

đối với tôi, tất cả các kết hợp đều hoạt động tốt với đoạn mã dưới đây, đoạn mã dành cho triển khai Angular-2, nếu bạn cần thêm ngày, hãy chuyển số dương ngày, nếu bạn cần phải vượt qua số âm của ngày.

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

0

Tôi nhận được số dặm tốt từ date.js:

http://www.datejs.com/

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

Đẹp!

Trang web bao gồm vẻ đẹp này:

Datejs không chỉ phân tích chuỗi, nó cắt chúng thành hai


0

Nếu bạn muốn trừ cả một số ngày và định dạng ngày của bạn ở định dạng có thể đọc được, bạn nên xem xét việc tạo một DateHelperđối tượng tùy chỉnh trông giống như thế này:

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

(xem thêm Fiddle này )


0

Xem mã sau đây, trừ các ngày kể từ ngày hiện tại. Ngoài ra, đặt tháng theo ngày được trừ.

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

-1

Khi đặt ngày, ngày chuyển đổi thành mili giây, vì vậy bạn cần chuyển đổi lại thành ngày:

Phương pháp này cũng có tính đến, thay đổi năm mới, vv

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

-1

Bạn có thể sử dụng 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

Đối với PHP,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Hy vọng nó sẽ giúp bạn.


-1

Tôi đã chuyển đổi thành mili giây và các ngày được khấu trừ vào tháng khác và năm sẽ không thay đổi và hợp lý

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

Hy vọng giúp


-1

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


1
Bạn phải luôn nhận xét mã / câu trả lời của mình vì một số người có thể không nhận được những gì bạn đang làm
Michael

-1

Sử dụng cú pháp hàm JavaScript hiện đại

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday


-1

Hãy thử một cái gì đó như thế này

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

currentDate có thể là bất kỳ ngày nào

giới hạn có thể là sự khác biệt về số ngày (tích cực cho tương lai và tiêu cực cho quá khứ)


-1

Điều này sẽ cung cấp cho bạn kết quả 10 ngày qua 110% làm việc mà bạn sẽ không gặp phải bất kỳ loại vấn đề nào

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;

bạn có thể thay đổi ngày trừ theo yêu cầu của bạn


-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;

-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.