为片刻添加持续时间 (moment.js)

IT技术 javascript momentjs
2021-03-06 02:26:14

时刻版本:2.0.0

阅读文档后,我认为这很简单(Chrome 控制台):

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = startdate.add(moment.duration(2, 'hours'));
returned_endate == expected_enddate  // false
returned_endate  // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

这是一个微不足道的例子,但我什至无法让它工作。我觉得我在这里错过了一些重要的东西,但我真的不明白。即使这样,这似乎也不起作用:

startdate.add(2, 'hours')
    // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

任何帮助将非常感激。

编辑: 我的最终目标是制作一个二进制状态图表,就像我在这里工作的那样:http : //bl.ocks.org/phobson/5872894

如您所见,我在解决此问题时目前正在使用虚拟 x 值。

3个回答

我认为您错过了文档中的一个关键点 .add()

通过添加时间来改变原始时刻。

您似乎将其视为返回不可变结果的函数。容易犯错。:)

如果您使用返回值,则它与您开始使用的实际对象相同。它只是为了方便方法链接而返回。

您可以通过克隆 moment 来解决此行为,如here所述

此外,您不能仅用于==测试。您可以将每个时刻格式化为相同的输出并进行比较,或者您可以只使用该.isSame()方法。

您的代码现在是:

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = moment(startdate).add(2, 'hours');  // see the cloning?
returned_endate.isSame(expected_enddate)  // true
确保您调用了一种显示方法,例如.format()or.toDate().unix()只看原始时刻是行不通的。您可能还想将yourmoment.utc().format()其格式化为 utc 而不是本地时间。
2021-04-18 02:26:14
是的,忘记这些时刻不是一成不变的会让你每隔一段时间。好的!
2021-04-23 02:26:14
我真的很感谢回复,马特。它澄清了很多事情。这是我仍然无法理解的:returned_endate我知道如何访问的每个表示仍然在午夜,而不是凌晨 2 点。我需要它是凌晨 2 点,以便我可以制作我正在处理的 D3 图表(请参阅已编辑的问题)。再次感谢。
2021-04-24 02:26:14
注意自我.add(2, 'mins')默默失败...你想要的.add(2, 'minutes')
2021-04-27 02:26:14

我正在开发一个跟踪实时路线的应用程序。乘客想要显示司机的当前位置和到达他/她的位置的预计到达时间。所以我需要在当前时间中添加一些持续时间。

所以我找到了下面提到的方法来做同样的事情。我们可以在当前时间中按时刻添加任何持续时间(小时、分钟和秒):

var travelTime = moment().add(642, 'seconds').format('hh:mm A');// it will add 642 seconds in the current time and will give time in 03:35 PM format

var travelTime = moment().add(11, 'minutes').format('hh:mm A');// it will add 11 mins in the current time and will give time in 03:35 PM format; can use m or minutes 

var travelTime = moment().add(2, 'hours').format('hh:mm A');// it will add 2 hours in the current time and will give time in 03:35 PM format

它满足我的要求。也许它可以帮助你。

应该是“分钟”而不是“分钟”。或者至少它可以是'm'。请更新您的答案!
2021-04-18 02:26:14
我的答案中已经是“分钟”,我已经提到我们可以使用“m”而不是“分钟”(请参阅​​答案的评论)。我认为没有必要更新我的答案。
2021-05-03 02:26:14
它应该是“分钟”而不是“分钟”。
2021-05-11 02:26:14

对于有startTime(如 12h:30:30) 和duration(以分钟为单位的值,如 120) 的人,您可以猜测endTime如下:

const startTime = '12:30:00';
const durationInMinutes = '120';

const endTime = moment(startTime, 'HH:mm:ss').add(durationInMinutes, 'minutes').format('HH:mm');

// endTime is equal to "14:30"