与 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 functions、isSame
、isBefore
、isAfter
、isSameOrBefore
、isSameOrAfter
, 和 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 在内部处理时间(模糊区域时刻)的方式相匹配。
谢谢
我让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 functions、
isSame
、isBefore
、isAfter
、isSameOrBefore
、isSameOrAfter
, 和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 在内部处理时间(模糊区域时刻)的方式相匹配。
谢谢