Moment Js içindeki iki tarih arasındaki saat farkını alın


385

MomentJ'leri kullanarak iki tarih arasındaki farkı elde edebiliyorum:

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

Ancak, uygulanabilir olduğunda saati de görüntülemek istiyorum (yalnızca> = 60 dakika geçtiğinde).

Ancak, aşağıdakileri kullanarak süre saatlerini almaya çalıştığınızda:

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

iki tarih arasındaki saat sayısını değil, geçerli saati döndürür.

İki An arasındaki saat farkı nasıl elde edilir?

Yanıtlar:


611

Yakındın. Sadece duration.asHours()yöntemi kullanmanız gerekir ( belgelere bakın ).

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

8
Olmamalı mı startTime.diff(end, 'hours', true);? Duration.asHours (); 25 saat önce olsaydı 1 dönecekti.
Daniel F

29
@DanielF MomentJS> = sürüm 2.0.0 kullanıyorsanız .diff(), evet kullanabilirsiniz . Ancak end.diff(startTime, 'hours', true)saat sayısını pozitif bir sayı olarak almak olacaktır . Ancak ikinci noktanız doğru değil. duration.hours()25 saat önce duration.asHours()olsaydı 1 dönecekti ama 25 dönecekti.
GregL

5
@GregL Düzeltilmiş durmak jsfiddle.net/qxxr1Lyr Yanlışlıkla .hours()fark etmeden yöntemi kullanmış olmalıyım .
Daniel F

5
Tüm yaptıklarında OP'nin bu kadar çok oyu var, OP'yi çoğu IDE'nin zaten size göstereceği bir yazım hatası hakkında bilgilendirmek ( imgur.com/a/ikyayIL ). Başkaları en iyi giyinmiş SO temsilcisi diğerleri hurda smh için çalışırken. Oh sen bir yazım hatası düzeltildi .. İşte 4.7k temsilcisi
zanderwar

3
@zanderwar Hayal kırıklığınızı anlıyorum, ama bu 5 yaşında bir soru. Bugün böyle sorular ve cevaplar uçmayacaktı.
Jean-François Fabre

218

Aşağıdaki kod bloğu, MomentJS kullanarak iki tarih arasındaki gün sayısı farkının nasıl hesaplanacağını gösterir.

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
En azından kod bloğu, kabul edilen cevaptan veya sorudan farklı olarak kullanılan tüm değişkenleri gösterdi. Birisi oyu düşürmek isterse, soruyu başlatmak için tamamlanmamış bir kod bloğu olduğu için oylamalıdır. Bu kod bloğunun gerçekten açıklanması gerekiyor mu?
Jordan Papaleo

23
Bu cevap benim için 'son' ve 'startTime' 'ın nereden geldiğini bilmediğiniz yukarıdaki kabul edilen cevaptan yeterince açık ve hatta daha eksiksiz ... Cevabınız için çok teşekkürler Raj!
Pierre

3
Şimdi geçmek biraz daha kolay var now = moment();. Bakınız momentjs.com/docs/#/parsing/now
rob3c

161

Veya basitçe şunları yapabilirsiniz:

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

dokümanlar: burada


12
Tüm saatleri, dakikaları ve saniyeleri birlikte nasıl gösterebilirim? HH: MM: SS gibi mi?
Faizan Saiyed

16

Tüm yapmanız gereken hoursmoment fark fonksiyonunun ikinci parametresi olarak geçmektir .

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

Dokümanlar: https://momentjs.com/docs/#/displaying/difference/

Misal:

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

Zamanı belli bir zamandan insan tarafından okunabilir şekilde döndürecek harika bir momentyöntem var, fromNow()şöyle:

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

Veya bunu iki belirli tarih arasında kullanmak isterseniz:

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

Dokümanlardan Alınan:


7

Bunun eski olduğunu biliyorum, ama burada tek bir astar çözümü:

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

Nerede başlar ve bitiş anı nesnelerdir.

Zevk almak!


... zaten Sebastián Lara tarafından 2016 yılında önerildi
YakovL

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

Gördüğünüz gibi, bu yöntemin çalışması için başlangıç ​​ve bitiş tarihinin moment nesneleri olması gerekiyordu.


2
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
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
Anların / dize temsillerinden gereksiz dönüşümleri kaldırırsanız, sonuçta kabul edilen yanıtı alırsınız.
Vladimir M

1
Değişken isimlerinin başlangıcındaki ekstra alt çizgiler neden?
zenw0lf

1

Benim durumumda saatler ve dakikalar istedim:

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

Daha fazla bilgi için resmi belgelere bakın .


0

Günün iki tarihi arasındaki toplam dakikaların altında kodun altında olabileceğini düşünüyorsanız, tam size yardımcı olacaktır Başlangıç ​​Tarihi: 2018-05-04 02:08:05 , Bitiş Tarihi: 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);
});
}

Çıktı

 [
  {
  "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

Bunun zaten cevaplandığını biliyorum ama yinelemeli ve daha genel bir şey istemeniz ve anıma güvenmemeniz durumunda fromNowyarattığım bu işlevi kullanabilirsiniz. Elbette mantığını, yıllar ve saniyeleri de destekleyecek şekilde ihtiyaçlarınıza göre ayarlayabilirsiniz.

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
Sadece kod göndermek yerine biraz açıklama ekleyebilir misiniz?
Paul Floyd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.