Tính ngày hôm qua trong JavaScript


277

Làm cách nào tôi có thể tính ngày hôm qua là ngày trong JavaScript?

Câu trả lời:


456
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)

12
Đẹp. Thoạt nhìn, có vẻ như điều này sẽ thất bại khi getDatetrả về ngày của tháng (ví dụ: 1 - 31) nhưng thực sự setDate(0)đặt ngày là ngày cuối cùng của tháng trước. Điều này có hoạt động trên tất cả các trình duyệt không?
vẽ Noakes

1
Không thể xác minh trình duyệt "tất cả" nhưng hoạt động trong tất cả các trình duyệt mà tôi đã kiểm tra camo.githubusercontent.com/,
James Kyburz vào

1
@Zargold Đừng hiểu ý của bạn. nút --version v9.4.0 nút const date = new Date () không xác định> date.toISOString () '2018-02-10T16: 26: 30.821Z'> date.setDate (date.getDate () - 1) 1518193590821> ngày .toISOString () '2018-02-09T16: 26: 30.821Z'
James Kyburz

Hmm vâng, chỉ cần kiểm tra trực tiếp và bạn đã đúng, không chắc trường hợp sử dụng của tôi khác biệt như thế nào và từ đó đã được tái cấu trúc hoàn toàn khỏi nó. Vì vậy, tôi sẽ không thể nhìn thấy.
Zargold

91

Không hiệu quả lắm, nhưng như oneliner:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

Ở trên tạo ra ba Dateđối tượng là không cần thiết lãng phí. Điều này có thể được giảm xuống thành một khởi tạo duy nhất với:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

Hoặc, nếu bạn thích:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

Hoặc, nếu bạn thích ES6 với chức năng mũi tên:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);

6
Tôi muốn tránh gây rối với phạm vi:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker

3
Nếu bạn cần một lớp lót, hãy sử dụng một cái gì đó như Ngày mới (Date.now () - 24 * 60 * 60 * 1000); điều này có lợi khi chỉ tạo một đối tượng Date. Nhưng thành thật, bất cứ ai của việc duy trì mã này sẽ được nhiều hạnh phúc hơn để xem phiên bản 2-đường rõ ràng hơn những gì họ sẽ một cái gì đó ném chức năng xung quanh (hoặc mili giây, cho rằng vấn đề).
Rob Whelan

65

Thử cái này

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

1
Lệnh tiếp theo d.setHours (19,59); Để đặt thời gian là 7:59 tối
James Jenkins

60

Đáng ngạc nhiên là không có câu trả lời cho giải pháp trình duyệt chéo dễ dàng nhất

Để tìm chính xác cùng một ngày hôm qua:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

Đó là nếu bạn muốn sử dụng miễn phí, nếu không, tôi khuyên bạn nên sử dụng http://momentjs.com


7
Làm thế nào để làm việc này khi tiết kiệm ánh sáng ban ngày thay đổi? Nó sẽ không va vào nó trước / sau một giờ chứ?
Adam Tegen

19

Để khái quát hóa câu hỏi và thực hiện các tính toán khác, hãy sử dụng:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

điều này tạo ra một đối tượng ngày mới dựa trên giá trị của "now" dưới dạng một số nguyên biểu thị epoch unix tính bằng mili giây trừ đi một ngày.

Hai ngày trước:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

Một tiếng trước:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);

Đây dường như là phương pháp an toàn nhất vì chúng tôi đang vận hành trên unix epoch được biểu thị dưới dạng mili giây. Vì vậy, số học an toàn hơn so với làm một cái gì đó như getDate () - 1. Tôi chưa thử getDate () - 1, nhưng dựa trên tài liệu của getDate (), nó sẽ trả về 1 nếu ngày hôm nay là ngày 1 của bất kỳ tháng nào. Và 1-1 = 0 không phải là ngày hợp lệ. Không chắc cách setDate (0) sẽ hoạt động.
Kapil Pendse

1
Đây là cách tiếp cận của tôi, mặc dù bạn cũng có thể đơn giản hóa nó một chút - hãy thử một cái gì đó như Ngày mới (Date.now () - 24 * 60 * 60 * 1000);
Rob Whelan

setDate (0), btw, sẽ ổn - nó sẽ lật sang ngày cuối cùng của tháng trước. Nhưng có vẻ như gọn gàng hơn (và trực quan hơn) khi thực hiện biểu diễn mili giây ở đây - đối với tôi - một nhược điểm là "số millis trong một ngày" không rõ ràng, vì vậy có thể dễ dàng gõ nhầm phép tính đó.
Rob Whelan

Làm việc với thời gian unix có vẻ như là tùy chọn đáng tin cậy hơn. Điều này nên được đánh giá cao hơn.
Paul

Vâng, tôi thích cách tiếp cận này tốt nhất. Có ít sự mơ hồ. Tôi đã kết thúc với new Date(Date.parse(new Date()) - 86400000). Mặc dù tôi thích Date.now () nên có lẽ tôi sẽ thử nó. Nó sẽ tiết kiệm thêm một ngày.
coblr

9

Tôi sử dụng thư viện khoảnh khắc , nó rất linh hoạt và dễ sử dụng.

Trong trường hợp của bạn:

let yesterday = moment().subtract(1, 'day').toDate();

2
bạn nên sử dụng tốt hơn subtractthay vìadd
Thomas Ayoub

Hoạt động tốt quá! Công việc tuyệt vời cho ng FullCalWiki và hợp lệ của anh ấy
XenoX


7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);

6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);


5

Điều này sẽ tạo ra ngày hôm qua lúc 00:00 với độ chính xác phút

var d = new Date();
d.setDate(d.getDate() - 1);
d.setTime(d.getTime()-d.getHours()*3600*1000-d.getMinutes()*60*1000);

2
d.setHours(0,0,0,0);

sẽ làm trò bịp


1
Sẽ không Tôi nghĩ rằng điều này chỉ đặt giờ, phút và giây của bạn thành 0, nhưng thực tế không thay đổi ngày?
Jesper Bylund

Tôi đã phải sử dụng số âm để đến ngày hôm qua : d.setHours(-1,0,0,0). Điều này sẽ trở lại vào ngày hôm qua, nhưng nó có thể không phải là thời gian bạn muốn (
23:00:00

1

Hãy thử này, làm việc cho tôi:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

Điều này đã cho tôi một đối tượng ngày trở lại cho ngày hôm qua


1
Vì bạn đang sử dụng today.setDate, hôm nay cũng sẽ thay đổi thành ngày hôm qua. Tốt hơn là tạo biến ngày hôm qua và sau đó đặt nó. var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)vì vậy bạn có thể sử dụng cả ngày hôm nay và ngày hôm qua
PersyJack

1

Dưới đây là một lớp lót được sử dụng để lấy ngày hôm nay theo định dạng YYYY-MM-DD trong văn bản và xử lý bù múi giờ.

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

Nó có thể thay đổi đáng kể thành ngày trở lại, x ngày trở lại. Để bao gồm thời gian, vv

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000


0

Nếu bạn muốn cả hai lấy ngày hôm qua và định dạng ngày đó theo định dạng có thể đọc được của con người, hãy 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 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(xem thêm Fiddle này )


0

Bạn có thể sử dụng khoảnh khắc này rất hữu ích, bạn có thể đạt được rất nhiều thứ với thư viện này.

Nhận ngày hôm qua với thời gian hiện tại moment().subtract(1, 'days').toString()

Nhận ngày hôm qua với một ngày bắt đầu moment().subtract(1, 'days').startOf('day').toString()


0

giải quyết vấn đề ngày biên (2020, 01, 01) -> 2019, 12, 31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);

-1

"Date.now () - 86400000" sẽ không hoạt động vào ngày kết thúc Tiết kiệm ánh sáng ban ngày (có 25 giờ ngày hôm đó)

Một tùy chọn khác là sử dụng Đóng:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
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.