Как сравнить разницу между текущей и будущей датой с точностью до месяца?

117
13 февраля 2021, 06:40

Есть задачка, в которой необходимо сравнить текущую дату с заданной в будущем с точностью до месяца включительно и определить разницу в количестве месяцев между датами и соответственно столько раз кликнуть на кнопку.

Т.е., к примеру, сегодняшняя дата: 15-06-2019, будущая: 07-09-2019 и надо прокликать (посчитать клики) ровно до того момента, когда получим 01-10-2019

Какой это месяц и сколько в нем дней (28,29,30 или 31) и текущий год (високосный или нет) нужно обязательно учитывать.

Вот, какие сделал наработки и дальше ступор..

var now = new Date(); 
var dateNow = new Date(now.getFullYear(), now.getMonth() + 1, now.getDate()); 
dateNow.setDate(1); 
var future = new Date("08/09/2019"); 
var futureTime = future.getTime(); 
var dateTime = dateNow.getTime(); 
if (futureTime > dateTime) { 
  $(".btn").click(); 
  dateTime += (86400000 * 30); 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<button class="btn">Button</button>

Answer 1

Немного не понял точные условия подсчёта, но предлагаю подсчитать количество месяцев заранее, а потом это число раз можно и по кнопке покликать.

function monthDiff(start, end) { 
    let months = 12*(end.getYear() - start.getYear()); // 12 месяцев на каждый год 
    months -= start.getMonth(); // сколько месяцев до начала 
    months += end.getMonth(); // сколько ещё осталось до конца 
 
    return months > 0 ? months : 0; 
} 
 
let now = new Date(); 
let future = new Date("2020-08-27"); 
let diff = monthDiff(now, future); 
console.log(diff); 
 
let clicks = []; 
for(let i = 0; i < diff; ++i) clicks.push(`click ${i+1}`); 
console.log(clicks.join('; ')); 
 
// Получим первое число следующего месяца: 
let finalDate = new Date; 
finalDate.setTime(future.getTime()); 
if (future.getDate() !== 1) { 
  finalDate.setMonth(future.getMonth()+1); 
  finalDate.setDate(1); 
} 
console.log(finalDate.toLocaleDateString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

На самом деле, точный расчёт зависит только от точной постановки задачи, что именно считать месяцем.

Неплохим решением будет использовать предназначенную для этого библиотеку:

let now = new Date(); 
let future = new Date("2020-08-27"); 
let diff = moment(future).diff(moment(now), 'month'); 
console.log(diff)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

READ ALSO
Ошибка CORS при работе с API

Ошибка CORS при работе с API

У Pinboard есть APIКогда я хочу обратится к нему из браузера мне выдает ошибку CORS

122
Slick slider + Thumbnails в модальном окне

Slick slider + Thumbnails в модальном окне

Планирую использовать slick slider в модальном окне (плагин Remodal)Посмотреть можно тут в разделе "Наши работы"

140
VueJS || Добавить Object в Object

VueJS || Добавить Object в Object

По клике на кнопку необходимо в Object добавить ObjectПоясняю что необходимо: Имею Object , который выглядит как структура разделов ( развернутый Object)

157
какие еще могут быть способы решения этой задачи? [закрыт]

какие еще могут быть способы решения этой задачи? [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

128