我正在开发的应用程序依赖于来自weather.gov API的预测数据。对于每个位置,都有一个不同的端点。数据模式非常标准,如下所示:
所有属性(温度,风速,风向等)都有一个值列表,每个值都包含给定时间段。这段时间的格式是这样的:
2018-04-27T04:00:00+00:00/PT1H
我猜,这意味着从2018年4月4日凌晨4点(UTC)起1小时。
如果我想获得当前温度,我会这样:
const now = new Date();
let currentTemperature;
data.properties.temperature.values.forEach((value) => {
if (now in value.validTime) {
currentTemperature = value;
}
});
now in value.validTime
只是一个伪条件。我知道不会以预期的方式工作。我只想找到一种方法来检查now
是否在该时间间隔内。
我在another question找到了:
时刻会使用
moment.duration
方法解析开箱即用的ISO格式的持续时间。
我想我可以通过两种方式打破API提供的日期,这样:
const [ start, duration ] = value.validTime.split('/');
然后使用时刻函数解析持续时间。然而,经过一些研究,我无法找到如何直接使用持续时间对象来执行我需要的检查。
实际上,我想出了一种方法:
const now = moment();
const [ start, duration ] = value.validTime.split('/');
const diff = moment(start).diff(now);
if (moment.duration(duration).asMilliseconds() > diff) {
// The current time (now) is in this interval.
}
但对于看起来更简单的解决方案来说似乎太过分了。
最后,我不一定要找到基于moment的解决方案。我可以使用不同的lib甚至简单的JS。
答案 0 :(得分:4)
您只需使用isBetween
:
检查片刻是否在两个其他时刻之间,可选择查看单位比例(分钟,小时,天等)。比赛是独家的。前两个参数将被解析为片刻,如果不是这样的话。
您的代码可能如下所示:
const now = moment();
const [ start, duration ] = value.validTime.split('/');
const dur = moment.duration(duration);
const end = moment(start).add(dur);
if ( now.isBetween(start, end) ) {
// The current time (now) is in this interval.
}