Dapatkan perbedaan jam antara dua tanggal di Moment Js


386

Saya bisa mendapatkan perbedaan antara dua tanggal menggunakan MomentJs sebagai berikut:

moment(end.diff(startTime)).format("m[m] s[s]")

Namun, saya juga ingin menampilkan jam saat berlaku (hanya ketika> = 60 menit telah berlalu).

Namun, ketika saya mencoba mengambil jam durasi menggunakan yang berikut:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();

itu mengembalikan jam saat ini dan bukan jumlah jam antara kedua tanggal.

Bagaimana cara saya mendapatkan perbedaan jam antara dua Momen?

Jawaban:


612

Anda sudah dekat. Anda hanya perlu menggunakan duration.asHours()metode ini (lihat dokumen ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();

8
Bukankah seharusnya begitu startTime.diff(end, 'hours', true);? Durasi.asHours (); akan kembali 1 jika 25 jam yang lalu.
Daniel F

29
@DanielF Jika Anda menggunakan MomentJS> = versi 2.0.0, Anda bisa menggunakan .diff(), ya. Kecuali itu akan end.diff(startTime, 'hours', true)mendapatkan jumlah jam sebagai angka positif. Namun, poin kedua Anda tidak benar. duration.hours()akan mengembalikan 1 jika 25 jam yang lalu, tetapi duration.asHours()akan kembali 25.
GregL

5
@ GregL saya berdiri jsfiddle.net/qxxr1Lyr dikoreksi saya pasti telah keliru menggunakan .hours()metode tanpa memperhatikan.
Daniel F

5
Bagaimana ini memiliki begitu banyak suara ketika semua itu dilakukan adalah membuat OP sadar akan kesalahan ketik yang sebagian besar IDE akan mengungkapkan kepada Anda ( imgur.com/a/ikyayIL ). SO rep adalah yang pertama dalam berpakaian terbaik sementara yang lain bekerja untuk memo smh. Oh Anda memperbaiki kesalahan ketik .. inilah rep 4.7k
zanderwar

3
@ zanderwar Saya mengerti frustrasi Anda, tetapi ini adalah pertanyaan berusia 5 tahun. Hari ini pertanyaan & jawaban seperti itu tidak akan terbang.
Jean-François Fabre

219

Blok kode berikut menunjukkan cara menghitung selisih jumlah hari antara dua tanggal menggunakan MomentJS.

var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)

61
Setidaknya blok kode-nya menunjukkan semua variabel yang digunakan tidak seperti jawaban yang diterima atau pertanyaan. Jika seseorang ingin memilih, mereka harus memilih pertanyaan karena ini adalah blok kode yang tidak lengkap untuk memulai. Apakah blok kode itu benar-benar perlu penjelasan?
Jordan Papaleo

23
Jawaban ini cukup jelas dan bahkan lebih lengkap bagi saya daripada jawaban yang diterima di atas, di mana Anda tidak tahu dari mana 'akhir' dan 'mulai waktu' berasal dari ... Terima kasih banyak atas jawaban Anda Raj!
Pierre

3
Ini sedikit lebih mudah untuk dilakukan var now = moment();. Lihat momentjs.com/docs/#/parsing/now
rob3c

161

Atau Anda dapat melakukannya dengan mudah:

var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4

docs: di sini


12
Bagaimana saya bisa menampilkan semua jam, menit dan detik bersama? Suka HH: MM: SS?
Faizan Saiyed

16

Yang perlu Anda lakukan adalah meneruskan hourssebagai parameter kedua untuk fungsi diff saat.

var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12

Documents: https://momentjs.com/docs/#/displaying/difference/

Contoh:

const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`${differenceInHours} hours have passed since this time yesterday`);
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


12

Ada momentmetode hebat yang disebut fromNow()yang akan mengembalikan waktu dari waktu tertentu dalam bentuk yang dapat dibaca manusia, seperti ini:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Atau jika Anda menginginkannya di antara dua tanggal tertentu, Anda dapat menggunakan:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Diambil dari Documents:


7

Saya tahu ini sudah tua, tapi di sini ada solusi satu liner:

const hourDiff = start.diff(end, "hours");

Di mana awal dan akhir adalah objek momen.

Nikmati!


... sudah diusulkan oleh Sebastián Lara pada tahun 2016
YakovL

2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

Seperti yang Anda lihat, tanggal mulai dan berakhir harus menjadi objek momen agar metode ini berfungsi.


2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Alexander

1
var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);

2
Hapus semua konversi yang tidak dibutuhkan dari / ke string representasi momen dan Anda akan berakhir dengan jawaban yang diterima.
Vladimir M

1
Mengapa garisbawah ekstra pada awal nama variabel?
zenw0lf

1

Dalam kasus saya, saya ingin berjam-jam:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes

Untuk info lebih lanjut, lihat dokumen resmi .


0

Jika Anda ingin total menit antara dua tanggal dalam satu hari selain dari kode di bawah ini akan membantu Anda untuk selengkapnya. Tanggal Mulai: 2018-05-04 02:08:05 , Tanggal Berakhir: 2018-05-14 09:04:07 ...

function countDaysAndTimes(startDate,endDate){
return new Promise(function (resolve, reject) {
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY')){
  var onlyDate1 = startDate.split(" ");
  var onlyDate2 = endDate.split(" ");
  var totalDays = moment(onlyDate2[0]).diff(moment(onlyDate1[0]), 'days')

  // First Day Entry
  dayObj.startDate = startDate;
  dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
  finalArray.push(dayObj);

  // Between Days Entry
  var i = 1;
  if(totalDays > 1){
    for(i=1; i<totalDays; i++){
      var dayObj1 = new Object;
      dayObj1.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
      finalArray.push(dayObj1);
    }
  }

  // Last Day Entry
  var dayObj2 = new Object;
  dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj2.endDate = endDate ;
  dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
  finalArray.push(dayObj2);

}
else{
  dayObj.startDate = startDate;
  dayObj.endDate = endDate;
  dayObj.minutes = datetime2.diff(datetime1, 'minutes');
  finalArray.push(dayObj);
}
console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
});
}

Keluaran

 [
  {
  "startDate":"2018-05-04 02:08:05",
  "endDate":"2018-05-05 00:00:00",
  "minutes":1311
  },
  {
  "startDate":"2018-05-05 00:00:00",
  "endDate":"2018-05-06 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-06 00:00:00",
  "endDate":"2018-05-07 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-07 00:00:00",
  "endDate":"2018-05-08 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-08 00:00:00",
  "endDate":"2018-05-09 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-09 00:00:00",
  "endDate":"2018-05-10 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-10 00:00:00",
  "endDate":"2018-05-11 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-11 00:00:00",
  "endDate":"2018-05-12 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-12 00:00:00",
  "endDate":"2018-05-13 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-13 00:00:00",
  "endDate":"2018-05-14 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-14 00:00:00",
  "endDate":"2018-05-14 09:04:07",
  "minutes":544
  }
 ]

0

Saya tahu ini sudah dijawab tetapi jika Anda menginginkan sesuatu yang rekursif dan lebih umum dan tidak bergantung pada saat fromNowAnda dapat menggunakan fungsi ini saya buat. Tentu saja Anda dapat mengubah logikanya untuk menyesuaikannya dengan kebutuhan Anda untuk juga mendukung tahun dan detik.

var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') {
    const validForUnit = expiresAt.diff(createdAt, unit);
    // you could adjust the if to your needs 
    if (validForUnit > 1 || unit === "minutes") {
    return [validForUnit, unit];
  }
  return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}

-9
            var timecompare = {
            tstr: "",
            get: function (current_time, startTime, endTime) {
                this.tstr = "";
                var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);

                if (t1s < t2s) {
                    this.t(t1s, t2s);
                }

                if (t1s > t2s) {
                    this.t(t1s, 23);
                    this.t(0, t2s);
                }

                var saat_dk = Number(s[1]);

                if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
                    return true;
                if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
                    return true;
                if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == this.tstr.length - 2))
                    return true;

                return false;

            },
            t: function (ii, brk) {
                for (var i = 0; i <= 23; i++) {
                    if (i < ii)
                        continue;
                    var s = (i < 10) ? "0" + i : i + "";
                    this.tstr += "," + s;
                    if (brk == i)
                        break;
                }
            }};

8
Bisakah Anda menambahkan beberapa penjelasan daripada hanya memposting kode?
Paul Floyd
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.