Jak uzyskać 30 dni przed aktualną datą?

100

Mam pole wprowadzania kalendarza początkowego i pole wprowadzania kalendarza końcowego. Chcemy, aby domyślne pole wprowadzania kalendarza początkowego 30 dni przed bieżącą datą i pole wprowadzania kalendarza końcowego było datą bieżącą. Oto moje vars randkowe.

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

Data końcowa byłaby podobna do var enddate = startdate - 30;tej. Oczywiście to nie zadziała.

Jeśli więc aktualna data to 30 grudnia 2011 r., Chciałbym, aby data początkowa to 1 grudnia 2011 r.

EDYCJA: Odpowiedzi na moje pytanie ... w pewnym sensie. Date.today();i Date.today().add(-30);działa, ale potrzebuję daty w formacie January 13, 2012. Nie Fri Jan 13 2012 10:48:56 GMT -055 (EST). Jakaś pomoc?

WIĘCEJ EDYCJI: W chwili pisania tego tekstu jest rok 2018. Wystarczy użyć Moment.js . To jest najlepsze.

Jesse Atkinson
źródło
stackoverflow.com/questions/563406/ ... Myślę, że to może pomóc.
Tim Withers

Odpowiedzi:

153

Spróbuj użyć doskonałej biblioteki dat JavaScript Datejs (oryginał nie jest już obsługiwany, więc możesz być zainteresowany tym aktywnie utrzymywanym widelcem ):

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

[Edytować]

Zobacz także doskonałą bibliotekę dat JavaScript Moment.js :

moment().subtract(30, 'days'); // or...
moment().add(-30, 'days');
maerics
źródło
3
Walczyłem o ustalenie daty rozpoczęcia i zakończenia 30 dni przed i po dzisiejszym dniu w UTC bez czasu. To zadziałało:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Dylan Valade
3
Użyłem tego moment()podejścia i dołączyłem toDate()metodę, aby odzyskać obiekt daty JavaScript. Dzięki!
Brylie Christopher Oxley,
6
Dlaczego miałbyś do tego używać biblioteki? To wydaje się szalone.
Harry
1
czy możesz polecić bibliotekę dla console.log?
Andre Elrico
160

Spróbuj tego

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

Jak zauważył @Neel, ta metoda zwraca w formacie znacznika czasu Javascript. Aby przekształcić go z powrotem w obiekt Date, musisz przekazać powyższe do nowego obiektu Date; new Date(priorDate).

Rory McCrossan
źródło
17
Bez korzystania z zewnętrznej biblioteki najbardziej podoba mi się to rozwiązanie. Dzięki.
Gowiem,
17
Zwróć uwagę, że ta metoda zwraca w formacie znacznika czasu JavaScript. Aby przekonwertować go z powrotem na obiekt daty, musisz przekazać powyższe donew Date(priorDate)
Neel
1
Czasami chcesz po prostu vanilla js bez biblioteki! Dzięki :)
Andrew McOlash
Otrzymuję setDate () nie jest funkcją
chovy
1
@chovy jedynym sposobem mogę sobie wyobrazić, że jesteś coraz to błąd, ponieważ nie dzwonisz setDate()na Dateobiekcie. Nie można jednak zdiagnozować bez zobaczenia kodu.
Rory McCrossan
91

Oto brzydkie rozwiązanie dla Ciebie:

var date = new Date(new Date().setDate(new Date().getDate() - 30));
Nahn
źródło
25
To zabawne rozwiązanie.
Mark Rogers,
8
Zgoda - to najlepsze rozwiązanie. To jest dokładnie rozwiązanie odpowiedzi Rory'ego McCrossana - ale zwięzłe i kompletne (nie są wymagane żadne zewnętrzne biblioteki).
Dan Nissenbaum
7
@MarkRogers „Hilariously” to właściwe słowo. Daty JavaScript są naprawdę absurdalne.
JosephStyons,
Tak, to jest proste i najlepsze rozwiązanie.
Sachini Witharana
40
startDate = new Date(today.getTime() - 30*24*60*60*1000);

.getTime()Metoda zwraca standardowy znacznik czasu JS (milisekund od stycznia 1/1970), w którym można wykorzystać regularne operacje matematyczne, które mogą być zasilane z powrotem do obiektu Date bezpośrednio.

Marc B.
źródło
10

Uzyskaj następne 30 dni od dzisiaj

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

Pobierz dzisiaj formularz z ostatnich 30 dni

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

WasiF
źródło
7

Javascript może sobie z tym poradzić bez żadnych zewnętrznych bibliotek.

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

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

Freddy
źródło
4

Łatwy.(Using Vanilla JS)

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

ISOFormat?

let days=30;
this.maxDateTime = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
manish kumar
źródło
3

let today = new Date()

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

last30Days będzie w obiekcie Date

Kevin Chandra
źródło
3

Prosty 1 liniowy kod Vanilla Javascript :

const priorByDays = new Date(Date.now() - days * 24 * 60 * 60 * 1000)

Na przykład: days = 7 Załóż aktualnydate = Fri Sep 18 2020 01:33:26 GMT+0530

Wynik byłby taki: Fri Sep 11 2020 01:34:03 GMT+0530

Piękno tego polega na tym, że możesz nim manipulować, aby uzyskać pożądany typ

  • znak czasu : Date.now() - days * 24 * 60 * 60 * 1000

  • ISOString: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString()

Christopher Fernandes
źródło
2

Używam date.js . Z łatwością sobie z tym radzi i dba o wszystkie paskudne lata przestępne.

Diodeus - James MacFarlane
źródło
2

Wolę moment js

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

endDate = moment().format('LL'); // February 28, 2015
Linoy
źródło
1

To jest wersja ES6

let date = new Date()
let newDate = new Date(date.setDate(date.getDate()-30))
console.log(newDate.getMonth()+1 + '/' + newDate.getDate() + '/' + newDate.getFullYear() )
Lawrence Edmondson
źródło
Czym różni się to od innych odpowiedzi, takich jak ta ? Poza tym nie ma tu nic, czego nie można byłoby zrobić w ES5 ... lub nawet w ES3.
Heretic Monkey
1

Możesz to zrobić po prostu za pomocą 1 linii kodu za pomocą momentu w Node JS. :)

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

Nie chcę formatu UTC, ŁATWIEJ: P

    let lastOneMonthDate = moment().subtract(30,"days").toISOString()
Shagun Pruthi
źródło
1

Jeśli nie masz ochoty na momentjs, możesz użyć tego:

let x = new Date()

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

Zasadniczo pobiera bieżącą datę (wartość liczbową daty bieżącego miesiąca), a następnie ustawia wartość. Następnie konwertuje do formatu ISO, z którego wycinam czystą datę numeryczną (tj. 2019-09-23)

Mam nadzieję, że to komuś pomoże.

Usman Khalil
źródło