Moment.js isBefore()在检查是否在12 pm/Noon之前不起作用

时间:2018-08-30 00:43:47

标签: javascript date datetime momentjs

我正在使用Moment.js来处理前端的一些日期标签。我遇到了一个晦涩的情况,请MomentJS专家对我进行纠正。

考虑下面的实现,并传入一个字符串值"2018-08-28T20:21:56"

请注意,上述日期字符串和添加分钟600是从后端动态提供的。

let dateTitle;

// Before setting date label, compare enddate with endoffset against 12pm
let endCutOff = moment("2018-08-28T20:21:56").add(600, 'm');
let isBeforeNoon = moment(endCutOff).isBefore(moment({ hour: 12, minute: 0 }));

if ( isBeforeNoon ) {
    // Credit previous day if user ended before noon.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .subtract(1, 'd')
    .format('MMMM D, YYYY');
} else {
    // Credit that very day if after 12pm.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .format('MMMM D, YYYY');
}

这将正确输出为“ 2018年8月28日”

但是,使用传入的字符串值"2018-08-29T20:43:58"再次执行相同的操作,您将看到输出为“ 2018年8月30日”

应为“ 2018年8月29日”

我知道显而易见的是,isBeforeNoon在第一轮是正确的,在下一轮是错误的。但是,有关为什么以及如何解决此问题的解释是我需要您的专业知识的地方。我怀疑这与传递的日期字符串格式有关,但是到目前为止,这只是一个概念。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果我正确理解情况,则可能是由于moment({ hour: 12, minute: 0 })的日期部分默认为“今天的日历日期”引起的。

默认情况下,.isBefore()会同时说明要比较的瞬间实例的时间和日期

因此,这意味着isBeforeNoon是根据endCutOff的日期和当前日历日期(显然总是在变化)决定的。

也许您可以执行以下操作:

let endCutOff = moment("2018-08-28T20:21:56").add(600, 'm');

// Create a copy of endCutOff to aquire the date from endCutOff, and set
// hour/minute accordingly
let momentForIsBefore = endCutOff.clone().hour(12).minute(0).second(0); 
let isBeforeNoon = moment(endCutOff).isBefore(momentForIsBefore);

if ( isBeforeNoon ) {
    // Credit previous day if user ended before noon.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .subtract(1, 'd')
    .format('MMMM D, YYYY');
} else {
    // Credit that very day if after 12pm.
    dateTitle = moment("2018-08-28T20:21:56")
    .add(600, 'm')
    .local()
    .format('MMMM D, YYYY');
}

希望这会有所帮助!