使用 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
isSame
和 isAfter
。并将它们与实际时刻对象一起使用:
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')
,你会得到一个错误。
如果您创建 finicio
和 hoy
矩对象而不是字符串,代码将起作用。或者,如果您提供格式化字符串:moment(finicio,"DD-MM-YYYY")
.
和以前一样,我建议在创建 hoy
、finicio
和 ffin
时只删除 .format
,这样您就可以使用力矩对象。
编辑:粒度
你可以用 isBefore
isSame
和 isAfter
做的另一件事是设置粒度。
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
});
我想为活动设置倒计时,所以只有在活动还没有开始的情况下,才会显示活动开始前几天的倒计时。日期像这样 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
isSame
和 isAfter
。并将它们与实际时刻对象一起使用:
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')
,你会得到一个错误。
如果您创建 finicio
和 hoy
矩对象而不是字符串,代码将起作用。或者,如果您提供格式化字符串:moment(finicio,"DD-MM-YYYY")
.
和以前一样,我建议在创建 hoy
、finicio
和 ffin
时只删除 .format
,这样您就可以使用力矩对象。
编辑:粒度
你可以用 isBefore
isSame
和 isAfter
做的另一件事是设置粒度。
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
});