Moment: 如何仅比较 HH:mm?

创建于 2013-10-20  ·  10评论  ·  资料来源: moment/moment

我在我的 node.js 项目中使用 moment.js

isWithinTime: function(end) {

     var moment = require('moment');
     var now = moment(new Date()).format('HH:mm');
     var end = moment(new Date(end)).format('HH:mm');

     if (now.toString() > end.toString()) {
         return false;
     }
     return true;
}

我只想比较 HH:mm 格式的时间。 但是它不起作用,因为

'7:00' > '2:00'

返回假。 任何想法如何比较 HH:mm?

最有用的评论

在查看了其他 MomentJS 问题后,我仍然对如何使用 moment 来简单地比较两个不同的时间感到困惑

我需要(想要)忽略日期/日期。

用例:
我正在从配置文件中读取带有开始和结束时间的时间表。 这是使用 Node.js 完成的

开始时间 = 下午 6:30
结束时间 = 凌晨 3:30

var currentTime= moment();    // e.g. 11:00 pm
var startTime = moment('06:30 pm', "HH:mm a");
var endTime = moment('03:30 am', "HH:mm a");

amIBetween = currentTime.isBetween(startTime , endTime);
console.log(amIBetween);   //  returns false.  if date ignored I expect TRUE

我的方案在技术上跨越两天,我理解为什么它是错误的。

我需要(期望)时刻返回 TRUE - 即 currentTime isBeteen startTime 和 endTime 并落在该范围内。

我想我已经通过检查 endTime 小时是否 > 12 来解决它,然后添加一天以让时刻了解它是第二天。 例如

if (startTime.hour() >=12 && endTime.hour() <=12 )
    {
        endTime.add(1, "days");       // handle spanning days
    }

    var isBetween = currentTime.isBetween(startTime, endTime);   // TRUE

但是如果 currentTime 也在午夜之后,那么它会中断 - 例如

上午 01:30 将不考虑在下午 06:30 和上午 03:30 之间 - 也是因为不同的日子

有什么其他建议可以完成此任务并简单地忽略日期/日期?

我发现很难相信它是如此复杂,但也许它是:

这里进一步澄清了跨越天数的问题,即使试图更明确:

var currentTime= moment('11:00p', "HH:mm a");
var startTime = moment('06:00p', "HH:mm a");
var endTime = moment('03:30a', "HH:mm a");

currentTime.toString(); //"Fri Oct 28 2016 23:00:00 GMT-0400"
startTime.toString();   // "Fri Oct 28 2016 18:00:00 GMT-0400"
endTime.toString();    // "Fri Oct 28 2016 03:30:00 GMT-0400"

currentTime.isBetween(startTime, endTime);  // false
currentTime.isAfter(endTime) && currentTime.isBefore(startTime); //false
currentTime.isAfter(startTime) && currentTime.isBefore(endTime); //false

似乎很明显它们是错误的,因为 _day/date_ 是按时刻考虑的。 这就是我想要解决的问题。

以下将起作用:

endTime.add(1, "days");
currentTime.isBetween(startTime, endTime);  // TRUE

然而,这意味着,我需要检查开始时间是否在上午 12 点之前 && 结束时间是否在上午 12 点之后,然后将 1 天添加到 ENDTIME。

所有10条评论

通常,如果您不关心结束时间的日期,最好只明确跟踪小时和分钟,但当然我对您的应用一无所知。 所以直接回答,定义一个新的函数来返回分钟数:

var minutesOfDay = function(m){
  return m.minutes() + m.hours() * 60;
}

然后检查:

return minutesOfDay(now) > minutesOfDay(end);

顺便说一句, moment()moment(new Date()) $ 做同样的事情,因此应该可以为您节省一些文本。

在查看了其他 MomentJS 问题后,我仍然对如何使用 moment 来简单地比较两个不同的时间感到困惑

我需要(想要)忽略日期/日期。

用例:
我正在从配置文件中读取带有开始和结束时间的时间表。 这是使用 Node.js 完成的

开始时间 = 下午 6:30
结束时间 = 凌晨 3:30

var currentTime= moment();    // e.g. 11:00 pm
var startTime = moment('06:30 pm', "HH:mm a");
var endTime = moment('03:30 am', "HH:mm a");

amIBetween = currentTime.isBetween(startTime , endTime);
console.log(amIBetween);   //  returns false.  if date ignored I expect TRUE

我的方案在技术上跨越两天,我理解为什么它是错误的。

我需要(期望)时刻返回 TRUE - 即 currentTime isBeteen startTime 和 endTime 并落在该范围内。

我想我已经通过检查 endTime 小时是否 > 12 来解决它,然后添加一天以让时刻了解它是第二天。 例如

if (startTime.hour() >=12 && endTime.hour() <=12 )
    {
        endTime.add(1, "days");       // handle spanning days
    }

    var isBetween = currentTime.isBetween(startTime, endTime);   // TRUE

但是如果 currentTime 也在午夜之后,那么它会中断 - 例如

上午 01:30 将不考虑在下午 06:30 和上午 03:30 之间 - 也是因为不同的日子

有什么其他建议可以完成此任务并简单地忽略日期/日期?

我发现很难相信它是如此复杂,但也许它是:

这里进一步澄清了跨越天数的问题,即使试图更明确:

var currentTime= moment('11:00p', "HH:mm a");
var startTime = moment('06:00p', "HH:mm a");
var endTime = moment('03:30a', "HH:mm a");

currentTime.toString(); //"Fri Oct 28 2016 23:00:00 GMT-0400"
startTime.toString();   // "Fri Oct 28 2016 18:00:00 GMT-0400"
endTime.toString();    // "Fri Oct 28 2016 03:30:00 GMT-0400"

currentTime.isBetween(startTime, endTime);  // false
currentTime.isAfter(endTime) && currentTime.isBefore(startTime); //false
currentTime.isAfter(startTime) && currentTime.isBefore(endTime); //false

似乎很明显它们是错误的,因为 _day/date_ 是按时刻考虑的。 这就是我想要解决的问题。

以下将起作用:

endTime.add(1, "days");
currentTime.isBetween(startTime, endTime);  // TRUE

然而,这意味着,我需要检查开始时间是否在上午 12 点之前 && 结束时间是否在上午 12 点之后,然后将 1 天添加到 ENDTIME。

我想我不太明白你所说的“忽略这一天”是什么意思。 如果你比较这两次

var startTime = moment('06:00p', "HH:mm a");
var endTime = moment('03:30a', "HH:mm a");

不知何故,系统必须知道您的意思是明天 3:30。 我的意思是,它怎么可能起作用? 当然,您不会认为在没有当天信息的情况下,凌晨 3:30 是在下午 6:00 之后......问题是您有一些 Moment 没有的额外上下文,即endTime预计在startTime之后; 从您的变量名称中可以看出这一点,但 Moment 不知道也不知道。 你必须告诉它。

那么这个怎么样:

if (startTime.isAfter(endTime)){
  endTime.add(1, 'days');
}

是的,我理解混乱。 不知道我们的意思是“凌晨 3:30”是第二天,这很棘手。

不考虑日期/日期:
_如果我问“晚上 9 点到凌晨 3 点之间是晚上 11 点”,我希望答案是正确的
如果我问“是上午 3 点到晚上 9 点之间的晚上 11 点”,我希望答案是错误的。_

由于我不能简单地忽略日期,因此我开始检查 12 点之前/之后的所有时间并最终得到:

if ( (startTime.hour() >=12 && endTime.hour() <=12 ) || endTime.isBefore(startTime) )
    {
        endTime.add(1, "days");       // handle spanning days endTime

        if (currentTime.hour() <=12 )
        {
            currentTime.add(1, "days");       // handle spanning days currentTime
        }
    }

我这里的小提琴显示了我的用例场景。 希望它有用。
https://jsfiddle.net/rfossella/66wjtnvk/1/

再次感谢您的时间(没有双关语:-))

或者只是这样的功能:

@Machibuse回答后更新

function getTime(dateTime: Moment): Moment {
    return moment({h: dateTime.hours(), m: dateTime.minutes()});
}

/** USAGE EXAMPLE */
const first: Moment = getTime( moment([2018, 5, 1, 17, 0, 0]) ); // 17:00
const second: Moment = getTime( moment([2013, 8, 2, 18, 0, 0]) );  // 18:00
const third: Moment = getTime( moment([2015, 3, 3, 19, 0, 0]) );  // 19:00

second.isAfter(first, 'minutes'); // true
first.isBefore(second, 'minutes'); // true
first.isAfter(second, 'minutes'); // false
second.isBefore(first, 'minutes'); // false

second.isBetween(first, third, 'minutes', '[]'); // true 
third.isBetween(first, second, 'minutes', '[]'); // false

// second.diff(first, 'minutes') => 60
// second.diff(third, 'minutes') => -60
// third.diff(first, 'minutes') => 120

所以你可以是 MomentJS 方法isBetween, isAfter, isBefore只有时间而不是日期。

尝试

second.isBetween(third, first, 'minutes', '[]'); // true

它不是 Moment 中的错误,而是文档中缺少第一个参数必须是较早日期的信息。

还是被这个难住了。 我在这上面的花费比我愿意承认的还要多! @Machibuse@rfossella什么实现最终起作用了?

我曾经被同样的问题困扰,终于找到了一种方法让它工作👍在军事时间格式化时间,我希望它可以帮助......

const isTimeBetween = function(startTime, endTime, serverTime) {
    let start = moment(startTime, "H:mm")
    let end = moment(endTime, "H:mm")
    let server = moment(serverTime, "H:mm")
    if (end < start) {
        return server >= start && server<= moment('23:59:59', "h:mm:ss") || server>= moment('0:00:00', "h:mm:ss") && server < end;
    }
    return server>= start && server< end
}

然后我可以像这样使用这个函数:

isTimeBetween('22:30', '3:00', '23:50') //return true
isTimeBetween('22:30', '3:00', '1:50') //return true
isTimeBetween('22:30', '3:00', '4:50') //return false

@kdavong效果很好,谢谢!

你好,
我重新检查了几年前发布的小提琴,它仍然有效并且仍然有效。 仅供参考:我的示例没有介绍军事时间,以防您确实需要。

我这里的小提琴显示了我的用例场景。 希望它有用。
https://jsfiddle.net/rfossella/66wjtnvk/1/

此页面是否有帮助?
0 / 5 - 0 等级