【问题标题】:Convert HH:MM:SS string to moment将 HH:MM:SS 字符串转换为矩
【发布时间】:2018-02-02 03:31:22
【问题描述】:

我正在使用完整日历,并试图查看创建的活动是否与我定义为工作时间一部分的午休时间重叠。这是我的代码

function isCalendarEventOverlappingBusinessHour(event) 
{
    var evts = businessHoursArr;

    for (i in evts) 
    {
        var start_moment=moment(evts[i].start, 'MMM DD').format();
        var end_moment=moment(evts[i].end);

        if (event.start.isBefore(end_moment) && event.end.isAfter(start_moment))
        {
            return true;
        }
    }

    return false;
}

我无法比较活动开始时间和工作时间开始时间,因为在工作时间,时间以字符串格式定义为08:00:00。我想把它转换成片刻,这样我就可以比较时间了。谁能推荐一个方法?

我的活动格式如下:

events.push({
    id: guid(),
    title: eventTitle,
    start: moment(date), 
    end: moment(date).add(defaultTimedEventDuration,'hours'),
    stick: true,
});

我的营业时间看起来像

{
    dow:[1,2,3,4,5]
    start:08:00:00
    end:12:00:00
},
{
    dow:[1,2,3,4,5]
    start:13:00:00
    end:17:00:00
}

【问题讨论】:

  • 只是你的格式字符串不对。对于时间,它将是 HH:mm:ss。 momentjs.com/docs/#/parsing/string-formats
  • @kra3 抱歉,我的意思是 HH:mm:ss。忽略标题中的大写字母
  • var start_moment=moment(evts[i].start, 'HH:mm:ss')
  • 为什么需要这样做?如果您按照文档中的说明将selecConstraint 设置为“businessHours”,则日历根本不会让任何人选择businessHours 之外的时间段。 fullcalendar.io/docs/selection/selectConstraint

标签: javascript fullcalendar momentjs


【解决方案1】:

我建议moment(value, 'HH:mm:ss').valueOf() 将返回一个整数,您可以在那时比较数字。

如果您提供一个示例来说明 businessHoursArrevent 的外观,也会有所帮助。

更新:获取您的代码并进行一些修改,这应该可以为您提供总体思路。

function isCalendarEventOverlappingBusinessHour(event) {
   var evts = businessHoursArr;
   var overlapping = false;
   var dayFormat = 'YYYYMMDD';
   var secFormat = dayFormat + 'HH:mm:ss';
   var eventStartDate = event.start.format(dayFormat);
   var eventEndDate = event.end.format(dayFormat);

   for (i in evts) {
       var start_moment = moment(eventStartDate + evts[i].start, secFormat);
       var end_moment = moment(eventEndDate + evts[i].end, secFormat);

       if (event.start.isBefore(end_moment) && event.end.isAfter(start_moment)) {
           overlapping = true;
           break;
       }
    }

    return overlapping;
}

【讨论】:

  • @Philomath 我用一些代码更新了我的答案,以帮助您朝着正确的方向前进
  • 我试过你的代码,虽然我没有收到任何错误,但它没有按预期工作。重叠总是错误的。这是我的输出业务时间:1517524200000,1517538600000 事件时间:1517571900000,1517575500000 业务时间:1517542200000,1517556600000 事件时间:1517571900000,1517575500000
  • @Philomath 我再次更新了。由于只使用 HH:mm:ss,所以 moment 将使用今天的日期。代码应使用比较的年、月、日,并仅附加选定的 HH:mm:ss
  • 是的,我理解你的逻辑。但即使现在重叠也是错误的。实际上,根据营业时间数组的示例,下午 12 点到下午 1 点之间不应该有预订。理想情况下,我们应该检查事件时间是否在那个间隙中
  • 查看小提琴中的控制台输出,代码有效:jsfiddle.net/2zx257yt 除非您期望处理道氏逻辑或 events.push({ start | end }) 时刻值未正确解析
猜你喜欢
  • 2019-08-07
  • 2017-01-16
  • 2015-07-06
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2011-06-04
  • 2012-11-27
相关资源
最近更新 更多