3

我确实让 fullcalendar 正常初始化。所以它代表当前日期。(午夜-> 午夜,1 天,1 小时时段)

从其他一些数据源我得到带有时间戳的数据。格式为“YYYY-MM-DD HH:mm”(作为字符串传输,无时区信息)

所以我将该字符串转换为一个时刻对象,并针对 fullcalendar.start 和 .end 进行测试以查看它是否在其中。

moment("2016-04-07 00:00") == $('#calendar').fullCalendar('getView').end

通过以下命令,这会导致错误

$('#calendar').fullCalendar('getView').end.format("YYYY-MM-DD HH:mm")

返回

"2016-04-07 00:00"

我也尝试与 diff 进行比较

moment("2016-04-07 00:00").diff( $('#calendar').fullCalendar('getView').end,"minutes")

返回

120

对 Chrome 开发工具中的 calendars.end 对象的一些研究表明,它在内部表示为

2016-04-07 02:00 GMT+0200

这对我来说看起来很奇怪。我在格林威治标准时间前 2 小时处于时区。所以它应该正确地说 2016-04-07 00:00 GMT+0200,不是吗?这也解释了为什么上面的差异测试导致了 120 分钟。

有人可以帮忙吗?我不知道转换问题来自哪里。我只使用没有时区信息的日期。如上所述,fullcalendar 在没有 gotodate 信息的情况下初始化,并显示从 00:00 到 00:00 的时间栏。那么为什么会有这个 2h 的差异呢?

4

2 回答 2

2

非常感谢。我现在对事情的理解好多了。我试图比较的一些日期是“现在”。我得到了“现在”

var n = moment()

原来是一个日期时间,包括我的时区。

例如 moment().format() 导致“2016-04-07 00:00 GMT+0200”,我现在看到这是如何出错的,除了与完整 calendar.end 的比较是真的但它是的 '2016- 04-07 00:00 GMT+0200' 是 UTC 的 '2016-04-06 22:00'。

作为

moment.utc() 

不起作用,我知道最终使用

moment.utc(moment().format('YYYY-MM-DD HH:mm'))

这现在似乎起作用了,因为它将我的当地时间视为UTC的“数字同时时间”。因此与fullcalendar在内部处理时间的方式相匹配(模糊区域时刻)。

谢谢

于 2016-04-09T09:42:45.123 回答
1

一些东西:

  • timezone参数控制FullCalendar如何处理时区。

  • 默认情况下,FullCalendar 使用“模糊分区时刻”。这些是在 fullCalendar 中对 moment.js 进行的自定义。 文档状态

    时刻对象也已扩展为表示没有指定时区的日期。在引擎盖下,这些时刻以 UTC 模式表示。

    因此,要在此模式下比较日期,请将它们视为 UTC。

    moment.utc("2016-04-07 00:00")
    
  • 要比较矩,请使用矩查询函数isSameisBeforeisAfterisSameOrBeforeisSameOrAfterisBetween

  • 在这种情况下,由于 FullCalendar 的开始日期是包含的,但结束日期是排他的,您可能希望像这样进行比较:

    var cal = $('#calendar').fullCalendar('getView');
    var start = cal.start;
    var end = cal.end;
    
    var m = moment.utc("2016-04-07 00:00");  // your input
    var between = m.isSameOrAfter(start) && m.isBefore(end);
    

请注意,对于将来的版本,moment 的isBetween功能有待增强,这将使您能够控制排他性,但目前isBetween是完全包容性的,因此您必须使用此处显示的功能组合。

于 2016-04-08T16:05:04.443 回答