使用 Moment.js 从日期中减去天数

Get days from substract to dates using Moment.js

我想为活动设置倒计时,所以只有在活动还没有开始的情况下,才会显示活动开始前几天的倒计时。日期像这样 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 是包含事件开始日期的那个,所以如果事件在五天开始,我不想得到那个数字,我试过了,但它 returns 一个 0 值.我也在用 jQuery。

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

好的,有几件事。

格式 returns 字符串

.format() 输出一个 string.

因此,当您执行 finicio < 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 对象。

这意味着您正在从字符串创建两个 moment 对象,而没有告诉 moment 它们是如何格式化的。如果你单独 运行 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

这里是评论中的JSFiddle

在我得到的帮助下,我post为任何感兴趣的人更正了代码

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