我在我的 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?
通常,如果您不关心结束时间的日期,最好只明确跟踪小时和分钟,但当然我对您的应用一无所知。 所以直接回答,定义一个新的函数来返回分钟数:
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/
抢
最有用的评论
在查看了其他 MomentJS 问题后,我仍然对如何使用 moment 来简单地比较两个不同的时间感到困惑
我需要(想要)忽略日期/日期。
用例:
我正在从配置文件中读取带有开始和结束时间的时间表。 这是使用 Node.js 完成的
我的方案在技术上跨越两天,我理解为什么它是错误的。
我需要(期望)时刻返回 TRUE - 即 currentTime isBeteen startTime 和 endTime 并落在该范围内。
我想我已经通过检查 endTime 小时是否 > 12 来解决它,然后添加一天以让时刻了解它是第二天。 例如
但是如果 currentTime 也在午夜之后,那么它会中断 - 例如
上午 01:30 将不考虑在下午 06:30 和上午 03:30 之间 - 也是因为不同的日子
有什么其他建议可以完成此任务并简单地忽略日期/日期?
我发现很难相信它是如此复杂,但也许它是:
这里进一步澄清了跨越天数的问题,即使试图更明确:
似乎很明显它们是错误的,因为 _day/date_ 是按时刻考虑的。 这就是我想要解决的问题。
以下将起作用:
然而,这意味着,我需要检查开始时间是否在上午 12 点之前 && 结束时间是否在上午 12 点之后,然后将 1 天添加到 ENDTIME。