Как получить за 30 дней до текущей даты?

100

У меня есть поле ввода начального календаря и поле ввода конечного календаря. Мы хотим, чтобы по умолчанию поле ввода календаря начиналось за 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/… Думаю, это может помочь.
Тим Уизерс,

Ответы:

154

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

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

[Редактировать]

См. Также отличную библиотеку дат JavaScript Moment.js :

moment().subtract(30, 'days'); // or...
moment().add(-30, 'days');
maerics
источник
3
Я изо всех сил пытался получить даты начала и окончания за 30 дней до и после сегодняшнего дня по всемирному координированному времени без времени. Это сработало:moment( moment().subtract(30, 'days') ).format("YYYY-MM-DD")
Дилан Валаде
3
Я использовал этот moment()подход и добавил toDate()метод, чтобы вернуть объект даты JavaScript. Благодарность!
Брайли Кристофер Оксли
6
Зачем вам для этого нужна библиотека? Это кажется безумием.
Гарри
1
вы можете порекомендовать библиотеку для console.log?
Андре Эльрико
160

Попробуй это

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

Как отмечает @Neel, этот метод возвращается в формате Javascript Timestamp. Чтобы преобразовать его обратно в объект даты, вам необходимо передать указанное выше в новый объект Date; new Date(priorDate).

Рори МакКроссан
источник
17
Мне больше всего нравится это решение без использования внешней библиотеки. Спасибо.
Говим
17
Обратите внимание, что этот метод возвращается в формате Javascript Timestamp. Для того, чтобы преобразовать его обратно на сегодняшний день объект, вам нужно пройти вышеnew Date(priorDate)
Ниль
1
Иногда вам просто нужен vanilla js без библиотеки! Спасибо :)
Эндрю МакОлаш
Я получаю, что setDate () не является функцией
chovy
1
@chovy единственный способ , которым я могу себе представить , что вы получаете эту ошибку, потому что вы не вызывая setDate()на Dateобъекте. Однако невозможно диагностировать, не видя своего кода.
Рори МакКроссан,
91

Вот вам неприятное решение:

var date = new Date(new Date().setDate(new Date().getDate() - 30));
Nahn
источник
25
Как ни странно, это лучшее решение.
Марк Роджерс
8
Согласен - это лучшее решение. Это в точности решение ответа Рори МакКроссана, но краткое и полное (внешние библиотеки не требуются).
Дэн Ниссенбаум
7
@MarkRogers "Весело" - правильное слово. Даты JavaScript поистине абсурдны.
JosephStyons
Да, это простое и лучшее решение.
Сачини Витхарана,
40
startDate = new Date(today.getTime() - 30*24*60*60*1000);

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

Марк Б
источник
10

Получите следующие 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())

ВАСИФ
источник
7

Javascript может справиться с этим без каких-либо внешних библиотек.

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

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

Фредди
источник
4

Легко.(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();
Маниш Кумар
источник
3

let today = new Date()

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

last30Days будет в объекте даты

Кевин Чандра
источник
3

Простой 1 лайнер ванильный код Javascript :

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

Например: days = 7 предположить текущийdate = Fri Sep 18 2020 01:33:26 GMT+0530

Результат будет: Fri Sep 11 2020 01:34:03 GMT+0530

Прелесть этого в том, что вы можете манипулировать им, чтобы получить результат желаемого типа.

  • отметка времени: Date.now() - days * 24 * 60 * 60 * 1000

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

Кристофер Фернандес
источник
2

Я использую date.js . Он легко справляется с этим и устраняет все неприятности високосного года.

Диодей - Джеймс Макфарлейн
источник
2

Я предпочитаю момент js

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

endDate = moment().format('LL'); // February 28, 2015
Линой
источник
1

Это версия 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.
Heretic Monkey
1

Вы можете сделать это просто с помощью одной строки кода, используя момент в Node JS. :)

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

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

    let lastOneMonthDate = moment().subtract(30,"days").toISOString()
Шагун Прути
источник
1

Если вы не склонны к momentjs, вы можете использовать это:

let x = new Date()

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

Обычно он получает текущую дату (числовое значение даты текущего месяца), а затем устанавливает значение. Затем он преобразуется в формат ISO, из которого я нарезаю чисто числовую дату (например, 2019-09-23).

Надеюсь, это кому-то поможет.

Усман Халил
источник