使用Moment.js获取从减法到日期的天数

时间:2015-01-16 17:40:30

标签: javascript jquery date momentjs

我想设置事件的倒计时,所以只有在事件没有开始的情况下,才会显示事件前几天的倒计时。日期存储在数据库中,如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变为天,但我不知道我的代码在哪里出错。

2 个答案:

答案 0 :(得分:1)

好的,有几件事。

Format返回字符串

.format()输出字符串

所以当你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和字符串是怎样的,而不是时刻对象。

这意味着您要从字符串创建两个时刻对象,而不会告诉它们如何格式化。如果单独运行moment('20-01-2015'),则会出现错误。

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

与以前一样,我建议您在创建.formathoyfinicio时删除ffin,以便有时间对象可以使用。

编辑:粒度

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

答案 1 :(得分:0)

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

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