Thêm thời lượng vào một khoảnh khắc (khoảnh khắc)


149

Phiên bản hiện tại: 2.0.0

Sau khi đọc tài liệu , tôi nghĩ rằng điều này sẽ đơn giản (bảng điều khiển 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]…}

Đây là một ví dụ tầm thường, nhưng tôi thậm chí không thể làm cho nó hoạt động được. Tôi cảm thấy như tôi đang thiếu một cái gì đó lớn ở đây, nhưng tôi thực sự không có được nó. Ngay cả điều này dường như không hoạt động:

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]…}

Bất kì sự trợ giúp nào đều được đánh giá cao.

Chỉnh sửa: Mục tiêu cuối cùng của tôi là tạo một biểu đồ trạng thái nhị phân giống như biểu đồ tôi đang làm việc ở đây: http://bl.ocks.org/phobson/5872894

Như bạn có thể thấy, tôi hiện đang sử dụng các giá trị x giả trong khi tôi xử lý vấn đề này.

Câu trả lời:


264

Tôi nghĩ rằng bạn đã bỏ lỡ một điểm quan trọng trong tài liệu cho .add()

Đột biến khoảnh khắc ban đầu bằng cách thêm thời gian.

Bạn dường như đang coi nó như là một hàm trả về kết quả bất biến. Dễ mắc lỗi. :)

Nếu bạn sử dụng giá trị trả về, nó là đối tượng thực tế giống như đối tượng bạn đã bắt đầu. Nó chỉ trở lại như một sự thuận tiện cho phương pháp xích.

Bạn có thể làm việc xung quanh hành vi này bằng cách nhân bản khoảnh khắc, như được mô tả ở đây .

Ngoài ra, bạn không thể chỉ sử dụng ==để kiểm tra. Bạn có thể định dạng từng khoảnh khắc cho cùng một đầu ra và so sánh chúng, hoặc bạn chỉ có thể sử dụng .isSame()phương pháp.

Mã của bạn bây giờ:

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

Tôi thực sự đánh giá cao phản ứng, Matt. Nó làm sáng tỏ nhiều thứ. Đây là những gì tôi vẫn không thể hiểu được: mọi đại diện returned_endatemà tôi biết cách truy cập vẫn là vào lúc nửa đêm chứ không phải 2 giờ sáng. Tôi cần nó là 2 giờ sáng để tôi có thể tạo một biểu đồ D3 mà tôi đang làm việc (xem câu hỏi đã được chỉnh sửa). Cảm ơn một lần nữa.
Paul H

14
Hãy chắc chắn rằng bạn gọi một trong những phương pháp hiển thị, chẳng hạn như .format()hay .toDate()hay .unix(). Chỉ cần nhìn vào khoảnh khắc thô sẽ không hoạt động tốt. Bạn cũng có thể muốn làm một cái gì đó như yourmoment.utc().format()định dạng nó là utc thay vì giờ địa phương.
Matt Johnson-Pint

3
Vâng, quên rằng những khoảnh khắc này không phải là bất biến cứ sau một thời gian. Đẹp!
Welbornio 13/07/2015

30

Tôi đang làm việc trên một ứng dụng mà chúng tôi theo dõi lộ trình trực tiếp. Hành khách muốn thể hiện vị trí hiện tại của tài xế và thời gian đến dự kiến ​​sẽ đến tại địa điểm của họ. Vì vậy, tôi cần thêm một số thời lượng vào thời gian hiện tại.

Vì vậy, tôi tìm thấy cách được đề cập dưới đây để làm như vậy. Chúng tôi có thể thêm bất kỳ thời lượng nào (giờ, phút và giây) trong thời gian hiện tại của chúng tôi:

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

Nó đáp ứng yêu cầu của tôi. Có thể nó có thể giúp bạn.


9
Nó sẽ là 'phút' không trong 'phút'.
Tanvi Agarwal

2
Nó phải là 'phút' chứ không phải 'phút'. Hoặc ít nhất nó có thể là 'm'. Hãy cập nhật câu trả lời của bạn!
Ulrich Dohou

1
đó là 'phút' trong câu trả lời của tôi và tôi đã đề cập rằng chúng ta có thể sử dụng 'm' thay vì 'phút' (xem các bình luận trả lời). Tôi nghĩ rằng không cần phải cập nhật câu trả lời của tôi.
Mahima Agrawal

6

Đối với những người có startTime(như 12h: 30: 30) và duration(giá trị tính bằng phút như 120), bạn có thể đoán endTimenhư vậy:

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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.