рассчитать между датой истечения срока действия и текущей датой, а затем вернуть оставшиеся дни в JavaScript

1

Добрый день, я хочу рассчитать оставшиеся дни между датой истечения срока действия и текущей датой, но кажется, что возвращение не то, что я ожидал.

function expiryDate(date_string) {

    var date = date_string.split("/");
    var year = parseInt(date[2]);
    var day = parseInt(date[1]);
    var month = parseInt(date[0]);

var expiration = new Date(month,day,year);

   var d = new Date();
var curr_day = d.getDate();
var curr_month = d.getMonth()+1;
var curr_year = d.getFullYear();

var current_date = new Date(curr_month, curr_day, curr_year);

return (expiration - current_date) / (1000*60*60*24);
}

приведенный выше код вернет правильные оставшиеся дни, если даты совпадают, например. текущая строка даты была 05/01/2018, и истечение срока будет одинаковым, и оно вернет 0, но когда я верну дату истечения срока действия 1 день, как 05/02/2018 возвращение 28 дней, что является неправильным.

Как я могу исправить эту проблему?

  • 1
    Я бы рекомендовал использовать библиотеку, например момент (см .: momentjs.com/docs/#/displaying/difference ), и избегать использования часовых поясов / високосных секунд / и т. Д. / И т. Д.
  • 0
    Месяцы индексируются нулем, поэтому var month = date[0] - 1 . Нет необходимости в parseInt или в библиотеке. Разница в днях просто Math.round((expiration - current_date)/8.64e7) и все готово.
Теги:
date
momentjs

4 ответа

0
Лучший ответ

Вы можете различать две даты с помощью функции momentjs diff()

Ниже приведен рабочий код:

function expiryDate(date_string) {
  var expiration = moment(date_string).format("YYYY-MM-DD");
  var current_date = moment().format("YYYY-MM-DD");
  var days = moment(expiration).diff(current_date, 'days');
  return days;
}

alert("Days remaining = " + expiryDate("2018-05-05"));
console.log("Days remaining = " + expiryDate("2018-05-05"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.js"></script>
  • 0
    У меня в предупреждении указано Предупреждение об устаревании: предоставленное значение не соответствует распознанному формату RFC2822 или ISO. момент конструирования возвращается к js Date (), который не надежен во всех браузерах и версиях. Форматы дат, не соответствующие RFC2822 / ISO, не рекомендуется и будут удалены в следующем основном выпуске.
  • 0
    @ Basaya да, это то, что я упомянул в комментарии рядом с функцией оповещения. "MM/DD/YYYY" не рекомендуется формат даты. Вы должны использовать некоторые другие форматы или просто игнорировать это.
Показать ещё 5 комментариев
1

Как отмечали другие, месяцы индексируются нулями. Кроме того, ваш метод обнуления часов не всегда будет работать так, как ожидалось, из-за летнего времени в некоторых местах. Но округление результата удалит эффекты DST.

Библиотеке нет необходимости, ваша функция синтаксического анализа и вычисления могут быть значительно упрощены, вы можете легко удалить другую строку из следующего:

/* @param {string} date_string - date in m/d/y format
** @returns {number} days between today and expiry
*/
function expiryDays(date_string) {
  var b = date_string.split(/\D/);
  var expiry = new Date(b[2],--b[0],b[1]);
  return Math.round((expiry - new Date().setHours(0,0,0,0)) / 8.64e7);
}

console.log(expiryDays('8/23/2018'));

// Or if you like obfuscated code
var expires = s=>Math.round((new Date(...(s.split(/\D/).reduce((a,v,i) => {a[(i+1)%3] = (i==0? v-1 : v);return a},[]))) - new Date().setHours(0,0,0,0))/8.64e7);

console.log(expires('8/23/2018'));
  • 0
    Это то, что я ищу, ни одна библиотека не является лучшим ответом. Спасибо, сэр. Вы немного опоздали, чтобы пометить свой ответ как правильный, но ваш ответ мне очень помог ..
  • 0
    @ basaya - забыл упомянуть, что функция expiryDays совместима с любой используемой реализацией.
1

Объект Date использует месяц с нулевым значением, где январь равен 0, февраль равен 1 и т.д. Кажется, вы попытались в одном месте компенсировать это, но не так.

Вам нужно исправить эту строку следующим образом:

var month = parseInt(date[0]) - 1;

И эта строка выглядит так:

var curr_month = d.getMonth(); // No +1

Разумеется, использование Moment.js, как было предложено, также является хорошей идеей, но я думал, что вам, возможно, захочется узнать, как заставить работать собственный код.

  • 0
    Я изменил код, и я попробовал ваше предложение, но оно похоже на тот же результат, что и моя проблема ... если моя дата истечения срока действия 05/02/2018, оставшиеся дни возврата будут 29 вместо 1 дня ... Я хочу знать, как это работает так же, как вы сказали, но я думаю, что библиотека момент является лучшим способом ...
-1

изначально работающая со временем - это много работы, и часто вы будете вкладывать много времени, возможно, библиотека moment.js может быть решением для вас в зависимости от необходимости, в частности, isBetween

перейдите по ссылке ниже.

moment.js

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') 
  • 0
    Спасибо за ответ, но каков результат или возвращаемое значение этого примера?
  • 0
    извините, результат в этом случае будет в днях, которые в примере возвращают 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню