เพิ่มช่วงเวลาลงไปครู่หนึ่ง (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 ดัมมี่ในขณะที่ฉันแก้ไขปัญหานี้

คำตอบ:


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 เพื่อให้ฉันสามารถสร้างแผนภูมิ D3 ที่ฉันกำลังทำงานอยู่ (ดูคำถามที่แก้ไขแล้ว) ขอบคุณอีกครั้ง.
พอล H

14
ให้แน่ใจว่าคุณเรียกวิธีใดวิธีหนึ่งการแสดงผลเช่น.format()หรือหรือ.toDate() .unix()เพียงแค่ดูช่วงเวลาที่ดิบจะไม่ทำงานได้ดี คุณอาจต้องการทำyourmoment.utc().format()รูปแบบเป็น utc แทนเวลาท้องถิ่น
Matt Johnson-Pint

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

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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.