【问题标题】:Get days from substract to dates using Moment.js使用 Moment.js 从减法到日期获取天数
【发布时间】:2015-01-16 17:40:30
【问题描述】:

我想为事件设置倒计时,所以只有在事件尚未开始的情况下,才会显示事件前几天的倒计时。日期像这样 DD-MM-YYYY 存储在数据库中,所以我使用 Moment.js 转换它们,但我仍然没有得到剩余的天数。这是我的代码

moment.locale('es');
        var hoy = moment().format("DD-MM-YYYY");
        var finicio = moment("20-01-2015", "DD-MM-YYYY").format("DD-MM-YYYY");
        var ffin = moment("19-01-2015", "DD-MM-YYYY").format("DD-MM-YYYY");
        $(function () {
            if (finicio < hoy) {
                $("#estadoevento").text("EXPIRADO");
            }
            else if (finicio > hoy) {
                $("#estadoevento").text("EN ESPERA");
                var contador = moment(finicio).diff(moment(hoy));
                var espera = moment.duration(contador);
                var restante = espera.asDays();
                $("#contador").text("FALTAN " + restante + " DÍAS");
            }
            else {
                $("#estadoevento").text("EN ESTE MOMENTO");
            }
        });

但是我没有得到这些值,我不知道是否必须重新声明我的变量,目前,如果事件已过期、传入或今天,代码只会在 span 标签上显示一条消息,并且可以正常工作。

变量finicio 是包含事件开始日期的变量,所以如果事件在五天开始,我想得到那个数字,我试过了,但它返回一个 0 值。我也在用 jQuery。

contador变量是两个日期的减法,变量espera得到contador的持续时间,最后restante变成天,但是不知道我的代码哪里错了。

【问题讨论】:

    标签: javascript jquery date momentjs


    【解决方案1】:

    好的,有几件事。

    格式返回字符串

    .format() 输出一个字符串

    因此,当您执行finicio &lt; hoy 时,您正在比较哪个字符串更大。如果字符串被格式化为YYYY-MM-DD(从最大到最小),这会很好,但是当它们有天数时,这将无法正确比较它们。

    改为使用isBefore isSameisAfter。并将它们与实际的时刻对象一起使用:

    var hoy = moment(); // No .format
    var finicio = moment("20-01-2015", "DD-MM-YYYY");
    var ffin = moment("19-01-2015", "DD-MM-YYYY");
    
    if( hoy.isAfter(finicio) ){ ... }
    

    从字符串创建时刻

    这个:

    var contador = moment(finicio).diff(moment(hoy));
    

    相同
    var contador = moment('20-01-2015').diff(moment('20-01-2015'));
    

    因为finicio 和how 是字符串,而不是矩对象。

    这意味着您正在从字符串创建两个矩对象,而不告诉矩它们是如何格式化的。如果单独运行moment('20-01-2015'),会报错。

    如果您制作 finiciohoy 时刻对象而不是字符串,则代码将起作用。或者,如果您提供格式字符串:moment(finicio,"DD-MM-YYYY")

    和以前一样,我建议您在创建 hoyfinicioffin 时删除 .format,以便您可以使用时刻对象。

    编辑:粒度

    您可以使用 isBefore isSameisAfter 做的另一件事是设置粒度。

    moment().isSame('2015-02-06'); // false, because time is different
    moment().isSame('2015-02-06', 'day'); // true, because anything smaller than days is ignored
    

    这是来自 cmets 的 JSFiddle 固定粒度。

    【讨论】:

    • 我错过了一件非常重要的事情,我将重写此代码并编辑帖子并进行更正,如果有任何问题我会联系您寻求帮助:) 谢谢
    • 我还有一个小问题,因为该代码非常适合之前和之后的操作,但是当试图让它在当前日期情况下工作时它不起作用。这是一个 JSFiddle jsfiddle.net/20s1j3h3
    • 不知道是isSame用对了还是格式不对
    • 对不起我还在尝试一些东西,目前第二个条件工作正常,问题是当我使用isSame时,当finicio等于当前日期时,它适用于else的第三个条件,当它应该显示事件当前正在发生的消息
    • 现在尝试运行它,我更改了finicio,所以日期与今天相同,但它仍然适用于其他
    【解决方案2】:

    在我在这里的帮助下,我为感兴趣的人发布了正确的代码

    moment.locale('es');//Spanish Language for Moment
            var hoy = moment();//Get client systemd date
            var finicio = moment("08-02-2015", "DD-MM-YYYY");//A date for event start
            var ffin = moment("12-02-2015", "DD-MM-YYYY");//A date for event end
            $(function () {
                if (hoy.isSame(finicio, "day")) {
                    $("#estadoevento").text("EN ESTE MOMENTO");
                }//To compare todays date with event start date
                else if (hoy.isBefore(finicio)) {
                    $("#estadoevento").text("EN ESPERA");
                    var falta = finicio.diff(hoy);
                    var duracionfalta = moment.duration(falta);
                    var faltante = Math.round(duracionfalta.asDays());
                    $("#contador").text("FALTAN " + faltante + " DÍAS");
                }//If event hasn't started yet, this shows the amount of days remaining
                else {
                    $("#estadoevento").text("EXPIRADO");
                }//When the event already passed
            });
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 2018-12-17
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多