【问题标题】:Counting down days left to a date? [duplicate]倒计时还剩多少天? [复制]
【发布时间】:2017-01-11 10:58:21
【问题描述】:

我在使用 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

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

【问题讨论】:

  • 我认为我应该使用 diffDate 而不是 daysInMonth 但是当我这样做时它只会显示 0

标签: javascript


【解决方案1】:

试试这个简短、简单、准确的代码:

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);
}

【讨论】:

  • 好主意。在时间从 DST 切换到标准的日子里,您会遇到一个小问题。在那些日子utc2 - utc1 可能会给 23 或 25 小时。您可以使用Math.round 而不是Math.floor 来处理这种情况。
  • 感谢@redneb 的建议,我会相应地更新我的代码
  • 很好的答案并且效果很好,但是它计算了总天数而不是数月和数年剩余的天数。
【解决方案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>

【讨论】:

  • 我确实考虑过使用 moment.js,但它对同时显示年份月份和日期没有限制吗?
  • 你的意思是格式化?如果是这样,不,它没有。多年来我一直很高兴地使用它。
  • stackoverflow.com/questions/17732897/… 这个问题说你只能使用它几天或几年或几个月,而不是全部三个?这是格式吗?
  • 问题中的解释是错误的。你不是问天差吗?你的目标是什么?
  • 这里的所有解决方案都在尝试找出日差,它们有何不同?
【解决方案3】:

这是一个函数,它将返回以年数、月数和天数表示的差异:

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);

【讨论】:

  • 我认为这将解决我的问题,但我将如何单独使用数据天、月、年?而不是一次全部?
  • 函数返回一个具有三个属性的对象。只需使用您需要的属性。喜欢interval.years。
  • 太棒了:)。这可能是一个简单的问题,但是如果没有 'months:' 部分,我将如何获得价值?
  • 你是什么意思?您希望days 类似于 266 而不会分成几个月?
  • 或者你的意思是console.log(interval.years, interval.days)?当然,如果您只删除月份部分,那将是不准确的表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2011-11-20
  • 2019-11-30
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多