【问题标题】:moment.format() returns next daymoment.format() 第二天返回
【发布时间】:2017-02-08 01:31:24
【问题描述】:

所以我使用 Fullcalendar 并在 dayClick 上尝试查找与点击日期匹配的事件。

 var events = $calendar.fullCalendar('clientEvents');
    if(events.length > 0) {
       for (var i = 0; i < events.length; i++) {
          if (date.format('YYYY-MM-DD') == events[i].start.format('YYYY-MM-DD')) {

    ...

现在

date.format('YYYY-MM-DD') 

返回我点击的那一天,但是当 for 循环到达那一天的事件时

events[i].start.format('YYYY-MM-DD')

第二天返回。这似乎受到 UTC 的影响,但这适用于所有有事件的日子。不只是今天。我尝试了不同的格式,但仍然相同。这是我注意到的一点:

n
_ambigTime:false
_ambigZone:true
_d:Thu Feb 09 2017 08:00:00 GMT-0500 (EST)
_f:"YYYY-MM-DD HH:mm:ss"
_fullCalendar:true
_i:"2017-02-08 13:00:00"
_isAMomentObject:true
_isUTC:true
_isValid:true
_locale:f

注意 _d 和 _i 是不同的。 _i 实际上是正确的日期/时间。那么如何引用呢?

【问题讨论】:

    标签: fullcalendar momentjs


    【解决方案1】:

    所有以_ 开头的矩属性(如_d_i)仅供内部使用,不应使用。

    如果您想检查两个时刻对象是否代表同一天,您可以使用isSame 传递第二个参数来限制粒度,而不是比较格式化字符串。在你的情况下:

    date.isSame(events[i].start, 'day')
    

    问题是您的某些对象是在 UTC 模式 (_isUTC: true) 下创建的,因此它们将使用 UTC 时间(在某些情况下为前一天)而不是本地时间来显示。

    更多关于UTC模式的信息here

    默认情况下,moment 解析并显示为当地时间。

    如果要解析或显示 UTC 时刻,可以使用 moment.utc() 代替 moment()。

    这为我们带来了 Moment.js 的一个有趣特性。 UTC 模式。

    在 UTC 模式下,所有显示方式都会以 UTC 时间显示,而不是本地时间。

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 2020-11-18
      • 1970-01-01
      • 2013-08-30
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多