Làm thế nào để có được 30 ngày trước ngày hiện tại?


95

Tôi có hộp nhập lịch bắt đầu và hộp nhập lịch kết thúc. Chúng tôi muốn mặc định hộp nhập lịch bắt đầu 30 ngày trước ngày hiện tại và hộp nhập lịch kết thúc là ngày hiện tại. Đây là bảng hẹn hò của tôi.

var today = new Date(),
    dd    = today.getDate(),
    mm    = today.getMonth(),
    yyyy  = today.getFullYear(),
    month = ["January", "February", "March",
        "April", "May", "June", "July", "August",
        "September", "October" "November", "December"],
    startdate = month[mm] + ", " + yyyy.toString();

Ngày kết thúc sẽ giống như var enddate = startdate - 30;Hiển nhiên là điều này sẽ không hoạt động.

Vì vậy, nếu ngày hiện tại là ngày 30 tháng 12 năm 2011, tôi muốn ngày bắt đầu là ngày 1 tháng 12 năm 2011.

CHỈNH SỬA: Câu hỏi của tôi đã được trả lời ... loại. Date.today();Date.today().add(-30);làm việc nhưng tôi cần ngày ở định dạng January 13, 2012. Không Fri Jan 13 2012 10:48:56 GMT -055 (EST). Bất kỳ giúp đỡ?

CHỈNH SỬA THÊM: Kể từ khi viết bài này là năm 2018. Chỉ cần sử dụng Moment.js . Đó là tốt nhất.


stackoverflow.com/questions/563406/… Tôi nghĩ điều đó có thể hữu ích.
Tim Withers

Câu trả lời:


149

Hãy thử sử dụng thư viện ngày JavaScript tuyệt vời của Datejs (bản gốc không còn được duy trì nên thay vào đó bạn có thể quan tâm đến đợt fork được duy trì tích cực này ):

Date.today().add(-30).days(); // or...
Date.today().add({days:-30});

[Biên tập]

Xem thêm thư viện ngày JavaScript tuyệt vời của Moment.js :

moment().subtract(30, 'days'); // or...
moment().add(-30, 'days');

3
Tôi đã cố gắng để có được ngày bắt đầu và kết thúc 30 ngày trước và sau ngày hôm nay theo giờ UTC mà không có thời gian. Điều này đã hoạt động:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Dylan Valade

3
Tôi đã sử dụng moment()phương pháp này và thêm toDate()phương thức để lấy lại đối tượng ngày JavaScript. Cảm ơn!
Brylie Christopher Oxley

4
Tại sao bạn cần sử dụng thư viện cho việc này? Điều đó có vẻ điên rồ.
Harry

1
bạn có thể giới thiệu một thư viện cho console.log không?
Andre Elrico

149

Thử cái này

var today = new Date()
var priorDate = new Date().setDate(today.getDate()-30)

Như đã lưu ý bởi @Neel, phương thức này trả về ở định dạng Dấu thời gian Javascript. Để chuyển đổi nó trở lại đối tượng date, bạn cần chuyển phần trên sang đối tượng Date mới; new Date(priorDate).


14
Không sử dụng thư viện bên ngoài, tôi thích giải pháp này nhất. Cảm ơn.
Gowiem

16
Lưu ý rằng phương thức này trả về ở định dạng Dấu thời gian Javascript. Để chuyển đổi nó trở lại đối tượng ngày, bạn cần phải vượt qua trên đểnew Date(priorDate)
Neel

1
Đôi khi bạn chỉ muốn js vani mà không có thư viện! Cảm ơn :)
Andrew McOlash

Tôi nhận được setDate () không phải là một hàm
chovy

1
@chovy cách duy nhất tôi có thể tưởng tượng rằng bạn đang gặp lỗi đó là vì bạn không gọi setDate()một Dateđối tượng. Tuy nhiên, không thể chẩn đoán nếu không nhìn thấy mã của bạn.
Rory McCrossan

86

Đây là một giải pháp xấu cho bạn:

var date = new Date(new Date().setDate(new Date().getDate() - 30));

24
Vui vẻ đây là giải pháp tốt nhất.
Mark Rogers

8
Đồng ý - đây là giải pháp tốt nhất. Đây chính xác là giải pháp cho câu trả lời của Rory McCrossan - nhưng ngắn gọn và đầy đủ (không cần thư viện bên ngoài).
Dan Nissenbaum

7
@MarkRogers "Vui nhộn" là từ phù hợp. Ngày của JavaScript thực sự vô lý.
JosephStyons

Có đây là một giải pháp đơn giản và tốt nhất.
Sachini Witharana

37
startDate = new Date(today.getTime() - 30*24*60*60*1000);

Các .getTime()phương thức trả về một timestamp JS chuẩn (mili giây kể từ khi Jan 1/1970) mà bạn có thể sử dụng các hoạt động toán học thường xuyên, có thể được đưa trở lại để đối tượng Date trực tiếp.


8

Nhận 30 ngày tiếp theo kể từ hôm nay

let now = new Date()
console.log('Today: ' + now.toUTCString())
let next30days = new Date(now.setDate(now.getDate() + 30))
console.log('Next 30th day: ' + next30days.toUTCString())

Nhận biểu mẫu 30 ngày qua ngay hôm nay

let now = new Date()
console.log('Today: ' + now.toUTCString())
let last30days = new Date(now.setDate(now.getDate() - 30))
console.log('Last 30th day: ' + last30days.toUTCString())


5

Javascript có thể xử lý nó mà không cần bất kỳ thư viện bên ngoài nào.

var today = new Date();
var dateLimit = new Date(new Date().setDate(today.getDate() - 30));

document.write(today + "<br/>" + dateLimit)


2

Dễ dàng.(Using Vanilla JS)

let days=30;
this.maxDateTime = new Date(Date.now() - days * 24 * 60 * 60 * 1000);

Định dạng ISO?

let days=30;
this.maxDateTime = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();


1

Tôi sẽ thích khoảnh khắc js hơn

startDate = moment().subtract(30, 'days').format('LL')  // January 29, 2015

endDate = moment().format('LL'); // February 28, 2015

0

Đây là phiên bản ES6

let date = new Date()
let newDate = new Date(date.setDate(date.getDate()-30))
console.log(newDate.getMonth()+1 + '/' + newDate.getDate() + '/' + newDate.getFullYear() )

Câu trả lời này khác với bất kỳ câu trả lời nào khác, như câu trả lời này như thế nào? Ngoài ra, không có gì ở đây không thể được thực hiện trong ES5 ... hoặc thậm chí là ES3.
Heretic Monkey

0

Bạn có thể làm điều đó đơn giản thông qua 1 dòng mã sử dụng moment trong Node JS. :)

    let lastOneMonthDate = moment().subtract(30,"days").utc().toISOString()

Không muốn định dạng UTC, DỄ DÀNG HƠN: P

    let lastOneMonthDate = moment().subtract(30,"days").toISOString()

0

Nếu bạn không thích momentjs, bạn có thể sử dụng cái này:

let x = new Date()

x.toISOString(x.setDate(x.getDate())).slice(0, 10)

Về cơ bản, nó lấy ngày hiện tại (giá trị số của ngày của tháng hiện tại) và sau đó đặt giá trị. Sau đó, nó chuyển đổi thành định dạng ISO mà từ đó tôi cắt giảm ngày số thuần túy (tức là 2019-09-23)

Hy vọng nó sẽ giúp một ai đó.


0

let today = new Date()

let last30Days = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 30)

last30Days sẽ ở trong Đối tượng ngày

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.