Добрый день, я хочу рассчитать оставшиеся дни между датой истечения срока действия и текущей датой, но кажется, что возвращение не то, что я ожидал.
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 дней, что является неправильным.
Как я могу исправить эту проблему?
Вы можете различать две даты с помощью функции 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>
"MM/DD/YYYY"
не рекомендуется формат даты. Вы должны использовать некоторые другие форматы или просто игнорировать это.
Как отмечали другие, месяцы индексируются нулями. Кроме того, ваш метод обнуления часов не всегда будет работать так, как ожидалось, из-за летнего времени в некоторых местах. Но округление результата удалит эффекты 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'));
Объект Date
использует месяц с нулевым значением, где январь равен 0, февраль равен 1 и т.д. Кажется, вы попытались в одном месте компенсировать это, но не так.
Вам нужно исправить эту строку следующим образом:
var month = parseInt(date[0]) - 1;
И эта строка выглядит так:
var curr_month = d.getMonth(); // No +1
Разумеется, использование Moment.js, как было предложено, также является хорошей идеей, но я думал, что вам, возможно, захочется узнать, как заставить работать собственный код.
изначально работающая со временем - это много работы, и часто вы будете вкладывать много времени, возможно, библиотека moment.js может быть решением для вас в зависимости от необходимости, в частности, isBetween
перейдите по ссылке ниже.
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')
var month = date[0] - 1
. Нет необходимости в parseInt или в библиотеке. Разница в днях простоMath.round((expiration - current_date)/8.64e7)
и все готово.