完整日历与UTC和本地日期混淆

fullcalendar confusion with UTC and local date

本文关键字:日期 日历 UTC      更新时间:2024-03-22

我确实让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")

返回

"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,不是吗?这也解释了为什么上面的diff测试在120分钟内完成。

有人能帮忙吗?我不知道转换问题是从哪里来的。我只使用没有时区信息的日期。如上所述,fullcalendar在没有最新信息的情况下初始化,并显示从00:00到00:00的时间条。那么,为什么会出现2小时的差异呢?

非常感谢。我现在确实更了解事情了。我试图比较的一些日期是"现在"。显示"现在"

var n = moment()

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

例如,moment().format()导致了"2016-04-07 00:00 GMT+0200",我现在明白了这是怎么出错的,除了与完整日历的比较。结果是true,但它是false因为"2016-04-08 00:00 GMT+2000"是UTC的"2016-04-06 22:00"。

作为

moment.utc() 

不起作用,我知道最后使用了

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

这现在似乎起作用了,因为它将我的本地时间视为UTC的"数字相同时间"。。从而与fullcalendar内部处理时间的方式相匹配(模糊地划分时刻)。

感谢

几件事:

  • 时区参数控制FullCalendar如何使用时区。

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

    moment对象也被扩展为表示没有指定时区的日期。在引擎盖下,这些时刻以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是完全包含的,因此您必须使用此处显示的功能组合。