与 UTC 和本地日期的全日历混淆

fullcalendar confusion with UTC and local date

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

我从其他一些数据源获取带有时间戳的数据。格式为"YYYY-MM-DD HH:mm"(以字符串形式传输,无时区信息)

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

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

这会导致 false 尽管以下命令

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

returns

"2016-04-07 00:00"

我也试过比较diff

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

哪个returns

120

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

2016-04-07 02:00 GMT+0200

我觉得这很奇怪。我在格林威治标准时间前 2 小时的时区。所以它应该正确地说 2016-04-07 00:00 GMT+0200,不是吗? 这也解释了为什么上面的 diff 测试结果是 120 分钟。

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

几件事:

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

  • 默认情况下,FullCalendar 使用 "ambiguously-zoned moments"。这些是在 fullCalendar 中对 moment.js 进行的自定义。 The docs state:

    The moment object has also been extended to represent a date with no specified timezone. Under the hood, these moments are represented in UTC-mode.

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

    moment.utc("2016-04-07 00:00")
    
  • 要比较时刻,请使用 moment query functionsisSameisBeforeisAfterisSameOrBeforeisSameOrAfter, 和 isBetween.

  • 在这种情况下,由于 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 是完全包含的,因此您必须结合使用此处显示的功能。

非常感谢。我现在确实更了解事情了。 我尝试比较的一些日期是 'now'。

我得到了 'now'
var n = moment()

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

例如moment().format() 结果为“2016-04-07 00:00 GMT+0200”,我现在明白这是怎么回事了,除了与 full calendar.end 的比较是 true 但它是 false 因为 '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 的 'numerical same time'。因此与 fullcalendar 在内部处理时间(模糊区域时刻)的方式相匹配。

谢谢