fullcalendar与UTC和本地日期的混淆

时间:2016-04-08 13:24:40

标签: javascript timezone fullcalendar momentjs datetime-conversion

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

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

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

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

通过以下命令

导致 false
$('#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日历工具中的日历和对象的一些研究表明,它内部表示为

2016-04-07 02:00 GMT+0200

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

有人可以帮忙吗?我没有得到转换问题的来源。我只使用没有时区信息的日期。如上所述,fullcalendar initalizes没有gotodate信息,并显示从00:00到00:00的时间栏。那么为什么会出现2h的差异?

2 个答案:

答案 0 :(得分:2)

非常感谢。我现在明白了很多事情。 我试图比较的一些日期现在是'。我现在得到了#39;通过

var n = moment()

结果是包含我的时区的约会时间。

E.g。 moment()。format()导致' 2016-04-07 00:00 GMT + 0200'而且我现在看到除了与完整日历的比较之外这是怎么回事。而且是真的但它是 false 为' 2016-04-07 00:00 GMT + 0200'是' 2016-04-06 22:00'在UTC。

作为

moment.utc() 

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

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

这现在似乎有效,因为这会影响我的当地时间,因为它将是同一时间的数字'在UTC ..因此匹配fullcalendar内部处理时间的方式(模糊区域时刻)。

由于

答案 1 :(得分:1)

一些事情:

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

  • 默认情况下,FullCalendar使用"模糊分区的时刻"。这些是在fullCalendar中对moment.js进行的自定义。 The docs state

      

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

    因此,要比较此模式中的日期,请将它们视为UTC格式。

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

  • 在这种情况下,由于FullCalendar的开始是包容性的,但结束日期是独占,您可能想要比较如下:

    isBetween

请注意,对于即将发布的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); 功能,还有一项待处理的增强功能,可让您控制排他性,但目前isBetween完全具有包容性,因此您必须使用此处显示的功能组合。