使用momentjs将当前时间添加到模糊日期

时间:2017-04-07 20:37:52

标签: fullcalendar momentjs

我目前正在使用FullCalendar,需要将当前时间添加到选择回调函数中的模糊日期时刻。

选择月中视图时,回调函数参数" start"和"结束"返回一个模糊日期(没有时间)的时刻。我使用以下内容将当前时间添加到日期然后将其转换回片刻,但想知道这是否是正确的方法...

if(!start.hasTime()){
    start = moment(start.format('YYYY-MM-DD'+' '+ moment().format('HH:mm:ss')));
      end = moment(  end.format('YYYY-MM-DD'+' '+ moment().format('HH:mm:ss')));
}

正如您所看到的,我正在转换"开始"和"结束"将日期和当前时刻转换为字符串,然后将连接的字符串转换回片刻。

我想确保我创建的那一刻是有效的ISO 8601格式。

谢谢, 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

official docs中说如果您调用format()功能,则会获得ISO 8601格式的日期。 看看这个:jsfiddle

此外,如果您不想处理时区,可以使用utc() method

答案 1 :(得分:0)

我遇到了同样的问题,奇怪的是当我升级到fullcalendar v3.40时。根据{{​​3}}, format()toISOString函数已在fullcalendar中被覆盖,因为模糊的时间只返回日期,即'2017-03-06'。要克服这个并设置时间,您需要创建一个新的时刻对象,这就是您所做的。为了确保跨浏览器的一致解析,您应该按照fullcalendar docs的建议指定要解析的格式。因此,对于您的方案,它将是:

    if(!start.hasTime()){
        var format = 'YYYY-MM-DD HH:mm:ss';
        start = moment(start.format('YYYY-MM-DD'+' '+ moment().format('HH:mm:ss')), format);
        end = moment(  end.format('YYYY-MM-DD'+' '+ moment().format('HH:mm:ss')), format);
    }

为了使代码更清晰,更易于阅读,您可以使用start时刻的unix时间戳(这是一个数字而不依赖于字符串格式)创建新时刻,并使用时间设置当下set功能。所以它现在看起来像这样:

    if(!start.hasTime()){
        var timestamp = start.valueOf();
        var now = moment();
        var startMomentWithNowTime = moment(timestamp).set({
          'hour': now.hour(),
          'minute': now.minute(),
          'second': now.second()
        });
        start = startMomentWithNowTime;
        end = startMomentWithNowTime;
    }

请原谅描述性变量命名startMomentWithNowTime。还有几行,但希望更容易阅读。您还可以将此逻辑包装在函数中以按需使用。希望它有所帮助!