我目前正在使用 FullCalendar,需要在选择回调函数中将当前时间添加到不明确的日期时刻。
在月视图中选择一天时,回调函数参数"开始"和"结束"返回一个不明确的日期(无时间)时刻。我正在使用以下内容将当前时间添加到日期,然后将其转换回时刻,但想知道这是否是正确的方法......
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格式。
谢谢 任何帮助将不胜感激。
在官方文档中说,如果您调用format()
函数,您将获得ISO 8601格式的日期。 看看这个: JSFIDDLE
此外,如果您不想处理时区,则可以使用utc()
方法
当我升级到完整日历 v3.40 时,我遇到了同样的问题,很奇怪。根据完整的日历文档,format()
和toISOString
函数已在 Fullcalendar 中被覆盖,用于不明确的计时时刻以仅返回日期,即"2017-03-06"。为了克服这个问题并设置时间,您需要创建一个新的时刻对象,这就是您所做的。但是,为了确保跨浏览器的解析一致,您应该按照 moment 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
。还有几行,但希望更容易阅读。还可以将此逻辑包装在函数中以按需使用。希望对您有所帮助!