Tambahkan durasi ke momen (moment.js)

149

Versi saat: 2.0.0

Setelah membaca dokumen , saya pikir ini akan langsung (Chrome console):

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

Ini adalah contoh sepele, tetapi saya bahkan tidak bisa membuatnya bekerja. Saya merasa seperti kehilangan sesuatu yang besar di sini, tetapi saya benar-benar tidak mengerti. Bahkan ini sepertinya tidak berhasil:

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

Bantuan apa pun akan sangat dihargai.

Sunting: Tujuan akhir saya adalah membuat bagan status biner seperti yang sedang saya kerjakan di sini: http://bl.ocks.org/phobson/5872894

Seperti yang Anda lihat, saya saat ini menggunakan nilai x dummy saat saya mengatasi masalah ini.

Paul H.
sumber

Jawaban:

264

Saya pikir Anda melewatkan titik kunci dalam dokumentasi untuk .add()

Memotong momen asli dengan menambahkan waktu.

Anda tampaknya memperlakukannya sebagai fungsi yang mengembalikan hasil yang tidak berubah. Kesalahan mudah dibuat. :)

Jika Anda menggunakan nilai balik, itu adalah objek aktual yang sama dengan yang Anda mulai. Ini baru saja dikembalikan sebagai kenyamanan untuk metode chaining.

Anda dapat mengatasi perilaku ini dengan mengkloning momen, seperti dijelaskan di sini .

Juga, Anda tidak bisa hanya menggunakan ==untuk menguji. Anda dapat memformat setiap momen dengan output yang sama dan membandingkannya, atau Anda bisa menggunakan .isSame()metode ini.

Kode Anda sekarang:

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
Matt Johnson-Pint
sumber
Saya sangat menghargai tanggapannya, Matt. Itu membersihkan banyak hal. Inilah yang masih belum bisa saya returned_endatepahami : setiap representasi yang saya tahu cara mengaksesnya masih di tengah malam, dan belum jam 2 pagi. Saya membutuhkannya jam 2 pagi sehingga saya bisa membuat bagan D3 yang sedang saya kerjakan (lihat pertanyaan yang diedit). Terima kasih lagi.
Paul H
14
Pastikan Anda memanggil salah satu metode tampilan, seperti .format()atau .toDate()atau .unix(). Hanya dengan melihat momen mentah tidak akan bekerja dengan baik. Anda mungkin juga ingin melakukan sesuatu seperti yourmoment.utc().format()memformatnya sebagai utc alih-alih waktu setempat.
Matt Johnson-Pint
3
Ya, lupa bahwa saat-saat ini tidak berubah membuatmu sesekali. Bagus!
welbornio
30

Saya sedang mengerjakan aplikasi tempat kami melacak rute langsung. Penumpang ingin menunjukkan posisi pengemudi saat ini dan perkiraan waktu kedatangan untuk mencapai di lokasinya. Jadi saya perlu menambahkan beberapa durasi ke waktu sekarang.

Jadi saya menemukan cara yang disebutkan di bawah untuk melakukan hal yang sama. Kami dapat menambahkan durasi (jam, menit, dan detik) dalam waktu saat ini menurut kami:

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

Memenuhi kebutuhan saya. Mungkin itu bisa membantu Anda.

Mahima Agrawal
sumber
9
Seharusnya 'menit' bukan 'menit'.
Tanvi Agarwal
2
Seharusnya 'menit' bukan 'menit'. Atau setidaknya bisa 'm'. Harap perbarui jawaban Anda!
Ulrich Dohou
1
ini sudah 'menit' dalam jawaban saya dan saya sudah menyebutkan bahwa kita bisa menggunakan 'm' daripada 'menit' (lihat komentar jawaban). Saya pikir tidak perlu memperbarui jawaban saya.
Mahima Agrawal
6

Untuk orang yang memiliki startTime(seperti 12h: 30: 30) dan duration(nilai dalam menit seperti 120), Anda dapat menebaknya endTimeseperti ini:

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"
Dibuat di Bulan
sumber