我目前正在使用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格式。
谢谢, 任何帮助将不胜感激。
答案 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
。还有几行,但希望更容易阅读。您还可以将此逻辑包装在函数中以按需使用。希望它有所帮助!