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


149

瞬间版本: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值。

Answers:


264

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

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

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

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

您可以通过克隆时刻来解决此问题,如此处所述

另外,您不能只==用来测试。您可以将每个时刻格式化为相同的输出并进行比较,或者可以只使用该.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

我非常感谢您的回应,马特。它清除了很多东西。这是我仍然无法解决的问题:returned_endate我知道如何访问的所有表示形式仍然是在午夜,而不是凌晨2点。我需要将其设为凌晨2点,这样我才能制作出我正在处理的D3图表(请参阅已编辑的问题)。再次感谢。
Paul H

14
请确保您拨打的显示方法,如一个.format().toDate().unix()。只看原始时刻是行不通的。您可能还想做一些类似yourmoment.utc().format()将其格式化为utc而不是本地时间的操作。
马特·约翰逊

3
是的,每隔一段时间就会忘记这些时刻并非一成不变。真好!
welbornio

30

我正在开发一个可以跟踪实时路线的应用程序。乘客希望显示驾驶员的当前位置以及到达他/她所在位置的预计到达时间。所以我需要在当前时间添加一些持续时间。

因此,我发现了以下提到的相同方法。我们可以按时在当前时间中添加任何持续时间(小时,分钟和秒):

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

它满足了我的要求。可能可以帮助您。


9
应该是“分钟”而不是“分钟”。
Tanvi Agarwal

2
应该是“分钟”而不是“分钟”。或者至少可以是“ m”。请更新您的答案!
Ulrich Dohou

1
我的答案已经是“分钟”了,我已经提到我们可以使用“ m”代替“分钟”(请参阅​​答案的注释)。我认为无需更新我的答案。
Mahima Agrawal '18

6

对于具有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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.