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

Javascript 完整日历与UTC和本地日期混淆,javascript,timezone,fullcalendar,momentjs,datetime-conversion,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

我让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开发工具中calendars.end对象的一些研究表明,它在内部表示为

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

有人能帮忙吗?我不明白转换问题从何而来。我只使用没有时区信息的日期。如上所述,fullcalendar初始化时没有gotodate信息,并显示从00:00到00:00的时间条。那么为什么会出现这种差异呢?

有几点:

  • 该参数控制FullCalendar在时区中的工作方式

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

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

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

    moment.utc("2016-04-07 00:00")
    
  • 要比较力矩,请使用、
    isSame
    isBefore
    isAfter
    issameorfter
    issameorfter
    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
是完全兼容的,因此您必须使用此处显示的功能组合。

非常感谢。我现在确实明白多了。 我试图比较的一些日期是“现在”。“现在”已经过去了

var n = moment()
结果是一个约会时间,包括我的时区

例如,矩().format()导致了“2016-04-07 00:00 GMT+0200”,我现在看到了这是如何出错的,除了与完整日历进行比较。end为true,但为false,因为“2016-04-07 00:00 GMT+0200”是UTC的“2016-04-06 22:00”

作为

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

moment.utc(moment().format('YYYY-MM-DD HH:mm'))
这似乎现在起作用了,因为它将我的本地时间视为UTC的“数字同一时间”。。因此与fullcalendar内部处理时间的方式相匹配(模糊地划分时间)


谢谢

使用
moment.utc().startOf('day')
不幸的是,我必须携带日期的时间部分。所以startOf(“day”)在我的情况下不起作用。我真的需要模糊的“现在”
moment.utc(moment().format('YYYY-MM-DD HH:mm'))