2016-09-03 3 views
1

У меня возникли проблемы с использованием функции с JS. Я получил этот код JS отсюда Difference between two dates in years, months, days in JavaScriptПодсчитайте дни, оставшиеся до даты?

Месяцы прекрасно работают, но когда я пытаюсь назвать дни, когда он не работает правильно, он покажет 30 дней, когда ему должно быть 24. Может ли кто-нибудь увидеть что-нибудь не так с кодом?

function monthDiff(d1, d2) { 
     var months; 
     months = (d2.getFullYear() - d1.getFullYear()) * 12; 
     months -= d1.getMonth() + 1; 
     months += d2.getMonth(); 
     return months <= 0 ? 0 : months; 
    } 
    function daysInMonth(date) { 
     return new Date(date.getYear(), date.getMonth() + 1, 0).getDate(); 
    }  
function diffDate(date1, date2) { 
    if (date2 && date2.getTime() && !isNaN(date2.getTime())) { 
     var months = monthDiff(d1, d2); 
     var days = 0; 

     if (date1.getUTCDate() >= date2.getUTCDate()) { 
      days = date1.getUTCDate() - date2.getUTCDate(); 
     } 
     else { 
      months--; 
      days = date1.getUTCDate() - date2.getUTCDate() + daysInMonth(date2); 
     } 

     // Use the variables months and days how you need them. 
    } 
} 

Вот переменная, которая использует функции

var  months = monthDiff(new Date(), options.timestamp) % 12 + 1, 
     days = daysInMonth(new Date()), 
+0

Я думаю, что я должен использовать в diffDate вместо DAYSINMONTH но когда я делаю это таким образом это будет только показать 0 – Krypton

ответ

2

Я думаю, что вы могли бы использовать moment.js

Не изобретать колесо снова.

Просто подключите Moment.js Date Range Plugin.


Пример:

var starts = moment('2014-02-03 12:53:12'); 
 
var ends = moment(); 
 

 
var duration = moment.duration(ends.diff(starts)); 
 

 
// with ###moment precise date range plugin### 
 
// it will tell you the difference in human terms 
 

 
var diff = moment.preciseDiff(starts, ends, true); 
 
// example: { "years": 2, "months": 7, "days": 0, "hours": 6, "minutes": 29, "seconds": 17, "firstDateWasLater": false } 
 

 

 
// or as string: 
 
var diffHuman = moment.preciseDiff(starts, ends); 
 
// example: 2 years 7 months 6 hours 29 minutes 17 seconds 
 

 
document.getElementById('output1').innerHTML = JSON.stringify(diff) 
 
document.getElementById('output2').innerHTML = diffHuman
<html> 
 
<head> 
 

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

 
    <script src="https://raw.githubusercontent.com/codebox/moment-precise-range/master/moment-precise-range.js"></script> 
 

 
</head> 
 
<body> 
 
    
 
    <h2>Difference between "NOW and 2014-02-03 12:53:12"</h2> 
 
    <span id="output1"></span> 
 
    <br /> 
 
    <span id="output2"></span> 
 
    
 
</body> 
 
</html>

+0

Я действительно рассматривал использование moment.js, но не имеет ли это предела с показом Years Months and Days в то же время? – Krypton

+0

Вы имеете в виду форматирование? Если да, то нет. Я использую его в течение многих лет с радостью. –

+0

http://stackoverflow.com/questions/17732897/difference-between-two-dates-in-years-months-days-in-javascript?rq=1 В этом вопросе говорится, что вы можете использовать его только для Дней или лет или месяцев не все три? Это форматирование? – Krypton

6

Попробуйте этот код, который является коротким, простым и точным:

var _MS_PER_DAY = 1000 * 60 * 60 * 24; 

// a and b are javascript Date objects 
var a = new Date("7/13/2010"); 
var b = new Date("12/15/2010"); 

function dateDiffInDays(a, b) { 
    // Discard the time and time-zone information. 
    var utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); 
    var utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); 

    return Math.round((utc2 - utc1)/_MS_PER_DAY); 
} 
+0

Хорошая идея. У вас будет небольшая проблема в дни, когда время переключается с DST на стандарт. В те дни 'utc2 - utc1' может дать 23 или 25 часов. Вы можете позаботиться об этом случае, используя 'Math.round' вместо' Math.floor'. – redneb

+0

Спасибо за предложение @redneb. Я обновлю свой код соответственно – Abhijeet

+0

Отличный ответ и отлично работает, однако он подсчитал общее количество дней, а не дни, оставшиеся от месяцев и лет. – Krypton

1

Вот функция, которая возвращает значение, выраженное в количество лет, месяцев и дней:

function dateDiff(d1, d2) { 
 
    var years = 0, months = 0, days = 0, arr; 
 
    if (d1 > d2) { // call inverse 
 
     interval = dateDiff(d2, d1); 
 
     return { 
 
      years: -interval.years, 
 
      months: -interval.months, 
 
      days: -interval.days 
 
     }; 
 
    } 
 
    days = d2.getDate() - d1.getDate(); 
 
    if (days < 0) { 
 
     months--; 
 
     days+= new Date(new Date(d2).setDate(0)).getDate(); 
 
    } 
 
    months += d2.getMonth() - d1.getMonth(); 
 
    if (months < 0) { 
 
     years--; 
 
     months+=12; 
 
    } 
 
    years += d2.getFullYear() - d1.getFullYear(); 
 
    return { 
 
     years: years, 
 
     months: months, 
 
     days: days 
 
    }; 
 
} 
 

 
// Sample data 
 
var d1 = new Date('2013-10-20'); 
 
var d2 = new Date('2016-12-16') 
 
// Call 
 
var interval = dateDiff(d1, d2); 
 
// Output each number separately 
 
console.log('Years: ', interval.years); 
 
console.log('Months: ', interval.months); 
 
console.log('Days: ', interval.days);

+0

Я думаю, что это решит мою проблему, но как я буду использовать данные дней, месяцев, лет в отдельности? а не сразу сразу? – Krypton

+0

Функция возвращает объект с тремя свойствами. Просто используйте свойство, которое вам нужно. Как 'interval.years'. – trincot

+0

Удивительный :). Это, наверное, простой вопрос, но как бы получить ценность без части «месяцев:»? – Krypton

Смежные вопросы