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?

Dani
sumber

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();
GregL
sumber
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)
selftaught91
sumber
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

Sebastián Lara
sumber
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>

JSON C11
sumber
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:

Dryden Williams
sumber
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!

Francois Nadeau
sumber
... 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.

Richang Sharma
sumber
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);
AKHIL
sumber
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 .

Anil Singh
sumber
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
  }
 ]
Renish Gotecha
sumber
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]);
}
Mounir Dhahri
sumber
-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;
                }
            }};
Osman AKTAS
sumber
8
Bisakah Anda menambahkan beberapa penjelasan daripada hanya memposting kode?
Paul Floyd