İki tarih arasındaki zaman farkını öğrenin


246

Ben momentjs ile her şeyi ve daha çevreci Tarihler yapabileceğimi biliyorum. Ama utanç verici bir şekilde, basit görünen bir şey yapmaya çalışırken zorlanıyorum: 2 kez arasındaki farkı elde etmek.

Misal:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

//expected result:
"00:39:30"

ne denedim:

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

Orada "10" un ne olduğunu anlamıyorum. Brezilya'da yaşıyorum, bu yüzden ilgili ise utc-0300'yiz.

Sonuç moment.duration(now.diff(then)), doğru dahili değerlere sahip bir süredir:

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

Yani, sanırım sorum şu: Bir momentjs süresi bir zaman aralığına nasıl dönüştürülür? Eminim kullanabilirsiniz

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

ama tamamen eksik olduğumdan daha zarif bir şey olduğunu hissediyorum .

güncelleme
daha yakından bakıyor, yukarıdaki örnekte now:

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

ve moment(moment.duration(now.diff(then))):

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

İkinci değerin neden Yaz Saati (-0200) içinde olduğundan emin değilim ... ama tarihleri ​​sevmediğimden eminim :(

güncelleme 2

Evet, değer -0200'dür, çünkü 31/12/1969 gün ışığının kullanıldığı bir tarihti ... yani bu.


2
"ama tarihleri ​​sevmediğimden eminim": P Bunu hiç okudun mu : nodatime.org/unstable/userguide/trivia.html ?
Boris Callens

Yanıtlar:


367

Bu yaklaşım SADECE toplam süre 24 saatten az olduğunda işe yarayacaktır:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

// outputs: "00:39:30"

24 saat veya daha fazla süreniz varsa, yukarıdaki yaklaşımla saatler sıfırlanır, bu nedenle ideal değildir.

24 saat veya daha uzun süreler için geçerli bir yanıt almak istiyorsanız, bunun yerine böyle bir şey yapmanız gerekir:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

Utc zamanını kısayol olarak kullandığımı unutmayın. Ayrı olarak d.minutes()ve d.seconds()ayrı olarak çekebilirsiniz , ancak onları sıfırlamanız gerekir.

Bir durationitirazı biçimlendirme yeteneği şu anda moment.js'de olmadığından bu gereklidir. Burada talep edildi . Ancak, moment-format biçimi adı verilen ve bu amaç için özel olarak üçüncü taraf bir eklenti vardır :

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"

31
@TML - 24 saat veya daha uzun süreler boyunca işe yaramayacağını açıkça söyledim.
Matt Johnson-Pint

1
Bu iyi çalıştı. momentjs öyle zarif bir kütüphane ki beni daha basit bir yolu yok ama belki de yaptığım şey çok "normal" değil beni şaşırtıyor. Muhtemelen 24 saatten fazla sürmezdim ama eğer olursa seçeneğe sahip olmak güzel. Yardımınız için teşekkürler.
Leo

69

Sorununuz biçimlendirmeden önce moment.duration () sonucunu moment () haline getirmektir; Bu, momentin () Unix çağına göre bir zaman olarak yorumlanmasıyla sonuçlanır.

Tam olarak aradığınız biçimi vermiyor, ancak

moment.duration(now.diff(then)).humanize()

size "40 dakika" gibi yararlı bir biçim verir. Bu biçimlendirmeye gerçekten meraklıysanız, kendiniz yeni bir dize oluşturmanız gerekir. Ucuz bir yol olurdu

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

nerede var diff = moment.duration(now.diff(then)). Bu size tek basamaklı değerlerde sıfır dolgu vermez. Bunun için, sadece birkaç ekstra sıfır için gitmek için uzun bir yol gibi görünse de, underscore.string gibi bir şey düşünmek isteyebilirsiniz . :)


4
ondalık basamaklar asHoursyerine kullanmak zorunda kalacaksınız hours. Aksi takdirde cevabımda yakaladığınız problemle aynı olurdu. :)
Matt Johnson-Pint

humanize () hoş bir dokunuş verir ama ben Matt öneri kullanarak sona erdi. Bahşiş için teşekkürler.
Leo

Bunu belirttiğiniz için teşekkürler, @MattJohnson - .asHours ve .hours farklı olduğunu fark etmedim, birinin diğeri için daha kısa bir isim olduğunu düşündüm, ancak daha yakından incelendiğinde haklısın.
TML

2
[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')İstenilen sonucu elde etmek için şunu kullanmak akıllıca olacaktır . ilk bölümde ondalık yok
KyleM


30

İki zaman damgasının farkını sadece aylara ve yıllara değil toplam günlere, saatlere ve dakikalara ayırmak istiyorsanız

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff 2 ay, 23 gün, 23 saat ve 20 dakika içerir. Ancak sonuca sadece gün, saat ve dakika olarak ihtiyacımız var, bu yüzden basit çözüm:

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

Nihai sonuç: 84 gün, 23 saat, 20 dakika.


19

Aradığınızda diff, moment.js milisaniye cinsinden farkını hesaplar. Milisaniye iletilirse duration, doğru süreyi hesaplamak için kullanılır. Ancak. ile aynı milisaniyeyi moment()ilettiğinizde, 1 Ocak 1970 (gece yarısı UTC / GMT) olan epoch / unix saatinden (sonra) milisaniye tarihini hesaplar. Bu yüzden 1969'u yanlış saatle birlikte yıl olarak alıyorsunuz.

duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")

Yani, moment.js'nin formatsüre boyunca işlev sunmadığı için bunu nasıl yapmanız gerektiğini düşünüyorum . Veya daha kolay / güzel hale getirmek için basit bir sargı yazabilirsiniz.


11

Bu iyi olmalı.

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());

Daha iyi çözüm! :)
JHenry

Şimdiye kadarki en iyi çözüm
Alaksandar Jesus Gene

9

Sadece ss: dd: ss istiyorsak, böyle bir işlev kullanabiliriz:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}

4
Cevap verdiğiniz hiçbir yerde moment kullanımı görmüyorum.
Joel

4

Bunu kullan,

  var duration = moment.duration(endDate.diff(startDate));

    var aa = duration.asHours();

3

Onun yerine

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Yapmak daha iyi

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

2

ES8'de moment kullanarak, şimdi ve moment nesneleri olmaya başlayın.

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');

2

Daktilo: aşağıdaki işe yaramalı ,

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};

0

Typescript ile basit bir fonksiyon oluşturuyorum

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

javascript oluşturmak için https://www.typescriptlang.org/play/index.html


0

InTime = 06: 38, Outtime = 15: 40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }

0

TARİH SAAT BAZLI GİRİŞ

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");


    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);


    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

ÇIKTI

{
"status": 200,
"Hour": 0,
"Mins": 5
}

0

ANLARLA EPOCH ZAMAN FARKI :

İki dönem arasındaki farkı elde etmek için:

Sözdizimi: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

Saat Farkı: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

Dakikalar arasındaki fark: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

Not:.toFixed() Kesin değerlere ihtiyacınız varsa kaldırabilirsiniz .

Kod:

const moment = require('moment')

console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

Çalışma örneğine buradan bakın: https://repl.it/repls/MoccasinDearDimension

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.