Как рассчитать разницу между двумя датами и процентное соотношение оставшихся дней?

#javascript #reactjs #date #momentjs

Вопрос:

В моем проекте react мне нужно рассчитать количество дней, оставшихся между двумя датами.То есть я просто хочу посчитать, сколько дней осталось с сегодняшнего дня до истечения срока годности.Затем я хочу рассчитать процент от оставшихся дней и в соответствии с этим я хочу найти цену.

То есть у меня есть план, ежемесячная стоимость которого составляет 500 долларов.Если клиент купил его в середине месяца, то есть, если осталось 15 дней, то цена за план должна составлять 50% от ежемесячной платы.Как мудрый.

то, что я сделал, это:

  const currentExpiry = license.current.expiry,//this is like 2021-08-01T10:23:18.275Z
       now = moment(),
       periodEnd = moment(currentExpiry);
 
  const daysRemaining = now.diff(periodEnd, "days");
  console.log("daysRemaining", daysRemaining);//here getting like -9
 

Как мне рассчитать этот процент?

Комментарии:

1. Приведенный вами код приводит к 428, а не -9 … что имеет смысл, так как 20 мая 2020 года определенно в прошлом

2. @Браво, извини, это моя вина. теперь я отредактировал код. Пожалуйста, проверьте

3. Чтобы рассчитать процент, вам нужна общая сумма. Учитывая то, что вы опубликовали, какова будет эта общая сумма?

Ответ №1:

Я думаю, что это возможное решение

 const currentExpiry = '2021-08-01T10:23:18.275Z'; //this is like 2021-08-01T10:23:18.275Z
const now = moment();
const periodEnd = moment(currentExpiry);
const costMonth = 500;

const daysRemaining = Math.abs(now.diff(periodEnd, "days"));

const daysOfMonth = moment().endOf('month').format('DD');

const cost = (costMonth / daysOfMonth * daysRemaining).toFixed(2);

console.log(`For ${daysRemaining} remaing days the cost is of ${cost}

 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> 


Ответ №2:

 const currentExpiry = license.current.expiry;
now = moment();
periodEnd = moment(currentExpiry);
daysRemaining = Math.abs(now.diff(periodEnd, "days"));
daysOfMonth = moment().endOf('month').format('DD');
percentageOfRemainingDays = (daysRemaining / daysOfMonth) * 100;
console.log(`Remaining days :${daysRemaining} and percentage of remaining days :${percentageOfRemainingDays}`);
 

Ответ №3:

Оставшаяся часть (end - now) ÷ (end - start) -это та часть, где различия выражены в днях. Умножение платы на часть дает пропорциональную плату.

 let today = moment().startOf('day');
let start = today.clone().startOf('month');
// To exclude last day of month in prorata fee
let end   = today.clone().endOf('month');
// To include last day of month in prorata fee
// let end   = start.clone().add(1, 'month');
let fee = 500;
let proRataFee = end.diff(today, 'days') / end.diff(start, 'days') * 500;

let f = 'ddd DD MMM';
console.log('Start   : '   start.format(f)  
          'nEnd     : '   end.format(f)   
          'nFee     : '   '

 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script> 


Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.


`);


Ответ №2:


Ответ №3:

Оставшаяся часть (end - now) ÷ (end - start) -это та часть, где различия выражены в днях. Умножение платы на часть дает пропорциональную плату.



Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.

fee
'nToday : ' today.format(f)
'nPro rata: ' '


Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.

`);


Ответ №2:


Ответ №3:

Оставшаяся часть (end - now) ÷ (end - start) -это та часть, где различия выражены в днях. Умножение платы на часть дает пропорциональную плату.



Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.

proRataFee.toFixed(2)
);


Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.

`);


Ответ №2:


Ответ №3:

Оставшаяся часть (end - now) ÷ (end - start) -это та часть, где различия выражены в днях. Умножение платы на часть дает пропорциональную плату.



Это вернет полную стоимость 1-го числа месяца и 0 долларов США в последний день месяца. Если вы также хотите взимать плату за последний день, сделайте конец началом следующего месяца.