Як отримати за 30 днів до поточної дати?


95

У мене є вікно введення початкового календаря та вікно введення кінцевого календаря. Ми хочемо, щоб за замовчуванням початок поля введення календаря за 30 днів до поточної дати, а поле введення кінця календаря було поточною датою. Ось моє побачення різне.

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

Дата завершення буде щось на зразок var enddate = startdate - 30;Очевидно, це не спрацює.

Отже, якщо поточною датою є 30 грудня 2011 року, я б хотів, щоб датою початку було 1 грудня 2011 року.

РЕДАГУВАТИ: На моє запитання відповіли ... якось. Date.today();і Date.today().add(-30);робота, але мені потрібна дата у форматі January 13, 2012. Ні Fri Jan 13 2012 10:48:56 GMT -055 (EST). Будь-яка допомога?

БІЛЬШЕ РЕДАКТУВАТИ: На момент написання статті 2018 рік. Просто використовуйте Moment.js . Це найкраще.


stackoverflow.com/questions/563406/… Я думаю, що це може допомогти.
Тім Уізерс

Відповіді:


149

Спробуйте скористатися чудовою бібліотекою дат JavaScript Datejs (оригінал більше не підтримується, тому натомість вас може зацікавити ця активно підтримувана вилка ):

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

[Редагувати]

Дивіться також чудову бібліотеку дат Moment.js JavaScript :

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

3
Я намагався отримати дати початку та кінця за 30 днів до і після сьогоднішнього часу в UTC без часу. Це спрацювало:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Ділан Валаде

3
Я використав moment()підхід і додав toDate()метод, щоб повернути об'єкт дати JavaScript. Дякую!
Brylie Christopher Oxley

4
Чому для цього потрібно використовувати бібліотеку? Це здається божевільним.
Гаррі

1
Ви можете порекомендувати бібліотеку для console.log?
Андре Елріко,

149

Спробуйте це

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

Як зазначає @Neel, цей метод повертається у форматі Javascript Timestamp. Щоб перетворити його назад на дату об'єкта, вам потрібно передати вищевказане в новий об'єкт Date; new Date(priorDate).


14
Без використання зовнішньої бібліотеки мені найбільше подобається це рішення. Дякую.
Gowiem

16
Зверніть увагу, що цей метод повертається у форматі Javascript Timestamp. Щоб перетворити його назад на дату об'єкта, вам потрібно передати вищезазначенеnew Date(priorDate)
Neel

1
Іноді вам просто хочеться ванільних js без бібліотеки! Дякую :)
Ендрю МакОлаш,

Я отримую setDate () не є функцією
chovy

1
@chovy єдиний спосіб , яким я можу собі уявити , що ви отримуєте цю помилку, тому що ви не викликаючи setDate()на Dateоб'єкті. Однак діагностувати неможливо, не побачивши свій код.
Rory McCrossan

86

Ось негарне рішення для вас:

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

24
Весело це найкраще рішення.
Mark Rogers

8
Домовились - це найкраще рішення. Це саме рішення рішення Рорі МакКроссана - але коротке і повне (зовнішні бібліотеки не потрібні).
Ден Ніссенбаум

7
@MarkRogers "Весело" - правильне слово. Дати JavaScript дійсно абсурдні.
JosephStyons

Так, це просте і найкраще рішення.
Sachini Witharana

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

.getTime()Метод повертає стандартну JS мітку часу (мілісекунди з січня 1/1970) , на якому ви можете використовувати регулярні математичні операції, які можуть бути подані в об'єкт Date безпосередньо.


8

Отримати наступні 30 днів від сьогодні

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

Отримайте форму за останні 30 днів сьогодні

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 може обробляти це без будь-яких зовнішніх бібліотек.

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

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


2

Легко.(Using Vanilla JS)

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

Формат ISO?

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


1

Я віддаю перевагу moment js

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

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

0

Це версія ES6

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

Чим це відрізняється від будь-якої іншої відповіді, як ця ? Крім того, тут немає нічого, чого б не можна було зробити в ES5 ... чи навіть ES3.
Єретична мавпа

0

Ви можете зробити це просто через 1 рядок коду, використовуючи момент у Node JS. :)

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

Не хочу формат UTC, ПРОСТО: P

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

0

Якщо ви не схильні до momentjs, ви можете використовувати це:

let x = new Date()

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

В основному він отримує поточну дату (числове значення дати поточного місяця), а потім встановлює значення. Потім він перетворюється у формат ISO, з якого я нарізаю чисто числову дату (тобто 2019-09-23)

Сподіваюся, це комусь допомагає.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.