Dapatkan perbedaan waktu antara dua data


246

Saya tahu saya bisa melakukan apa saja dan beberapa lagi melibatkan Tanggal dengan momen. Tetapi memalukan, saya mengalami kesulitan mencoba melakukan sesuatu yang tampaknya sederhana: mendapatkan perbedaan antara 2 kali.

Contoh:

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

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

apa yang saya coba:

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  

Saya tidak mengerti apa itu "10" di sana. Saya tinggal di Brazil, jadi kami utc-0300 jika itu relevan.

Hasilnya moment.duration(now.diff(then))adalah durasi dengan nilai internal yang benar:

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

Jadi, saya kira pertanyaan saya adalah: bagaimana cara mengubah Durasi sejenak ke interval waktu? Saya yakin bisa menggunakannya

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

tetapi saya merasa ada sesuatu yang lebih elegan yang benar-benar hilang.

pembaruan
tampak lebih dekat, dalam contoh di atas nowadalah:

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

dan moment(moment.duration(now.diff(then)))adalah:

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

Saya tidak yakin mengapa nilai kedua ada di Siang Hari (-0200) ... tapi saya yakin saya tidak suka tanggal :(

pembaruan 2

nah, nilainya adalah -0200 mungkin karena 31/12/1969 adalah tanggal di mana waktu siang hari digunakan ... jadi begitu.


2
"tapi saya yakin saya tidak suka kencan": P Apakah Anda pernah membaca ini: nodatime.org/unstable/userguide/trivia.html ?
Boris Callens

Jawaban:


367

Pendekatan ini akan HANYA berlaku ketika total durasi kurang dari 24 jam:

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"

Jika Anda memiliki 24 jam atau lebih, jam akan diatur ulang ke nol dengan pendekatan di atas, sehingga tidak ideal.

Jika Anda ingin mendapatkan respons yang valid untuk durasi 24 jam atau lebih, maka Anda harus melakukan sesuatu seperti ini:

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"

Perhatikan bahwa saya menggunakan waktu utc sebagai jalan pintas. Anda dapat menarik keluar d.minutes()dan d.seconds()secara terpisah, tetapi Anda juga harus zeropad.

Ini diperlukan karena kemampuan untuk durationmengajukan keberatan saat ini tidak ada di moment.js. Sudah diminta di sini . Namun, ada plugin pihak ketiga yang disebut format saat-durasi- yang khusus untuk tujuan ini:

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 - Saya jelas mengatakan itu tidak akan bekerja selama 24 jam atau lebih.
Matt Johnson-Pint

1
Ini bekerja dengan baik. momentjs adalah perpustakaan yang begitu elegan dan mengejutkan saya tidak memiliki cara yang lebih sederhana tapi mungkin yang saya lakukan tidak begitu "normal". Saya mungkin tidak akan memiliki lebih dari 24 jam tetapi itu baik untuk memiliki opsi jika itu terjadi. Terima kasih atas bantuan Anda.
Leo

69

Masalah Anda adalah dalam meneruskan hasil moment.duration () kembali ke saat () sebelum memformatnya; ini menghasilkan saat () menafsirkannya sebagai waktu relatif ke zaman Unix.

Itu tidak memberi Anda persis format yang Anda cari, tetapi

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

akan memberi Anda format yang bermanfaat seperti "40 menit". Jika Anda benar-benar tertarik pada pemformatan tertentu, Anda harus membuat sendiri string baru. Cara yang murah akan

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

mana var diff = moment.duration(now.diff(then)). Ini tidak memberi Anda bantalan nol pada nilai digit tunggal. Untuk itu, Anda mungkin ingin mempertimbangkan sesuatu seperti underscore.string - meskipun sepertinya jalan yang panjang untuk beberapa nol saja. :)


4
Anda harus menggunakan asHourssebagai gantinya hours, dan melakukan desimal. Kalau tidak, itu akan memiliki masalah yang sama yang Anda tangkap dalam jawaban saya. :)
Matt Johnson-Pint

memanusiakan () memberikan sentuhan yang bagus tapi saya akhirnya menggunakan saran Matt. Terima kasih atas tipnya.
Leo

Terima kasih telah menunjukkannya, @MattJohnson - Saya bahkan tidak menyadari .s jam dan. Jam Anda berbeda, mengira satu hanya nama yang lebih pendek untuk yang lain, tetapi pada pemeriksaan lebih dekat, Anda benar.
TML

2
Catatan, sebaiknya menggunakan: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')untuk mendapatkan hasil yang diinginkan. tanpa desimal di bagian pertama
KyleM


30

Jika Anda ingin perbedaan dua cap waktu menjadi total hari, jam dan menit saja, bukan dalam bulan dan tahun.

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)));

beda mengandung 2 bulan, 23 hari, 23 jam dan 20 menit. Tetapi kami hanya membutuhkan hasil dalam hitungan hari, jam, dan menit sehingga solusi sederhana adalah:

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.

Hasil akhir akan menjadi: 84 hari, 23 jam, 20 menit.


19

Saat Anda menelepon diff, moment.js menghitung perbedaan dalam milidetik. Jika milidetik dilewatkan ke duration, digunakan untuk menghitung durasi mana yang benar. Namun. ketika Anda melewatkan milidetik yang sama ke moment(), itu menghitung tanggal milidetik dari (setelah) zaman / waktu unix yaitu 1 Januari 1970 (tengah malam UTC / GMT). Itu sebabnya Anda mendapatkan 1969 sebagai tahun bersama dengan jam yang salah.

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

Jadi, saya pikir ini adalah bagaimana Anda harus melakukannya sejak moment.js tidak menawarkan formatfungsi untuk durasi. Atau Anda bisa menulis pembungkus sederhana untuk membuatnya lebih mudah / lebih cantik.


11

Ini seharusnya bekerja dengan baik.

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());

Solusi yang lebih baik! :)
JHenry

Solusi Terbaik yang pernah
Alaksandar Jesus Gene

9

Jika kita hanya menginginkan jj: mm: dd, kita dapat menggunakan fungsi seperti itu:

//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
Saya tidak melihat saat penggunaan di mana pun dalam jawaban Anda.
Joel

4

Gunakan ini,

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

    var aa = duration.asHours();

3

Dari pada

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

Lebih baik dilakukan

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

2

Dalam ES8 menggunakan momen, sekarang dan mulai menjadi objek momen.

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

Naskah: mengikuti harus bekerja,

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

Saya membuat fungsi sederhana dengan naskah

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)

untuk menghasilkan javascript 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

INPUT BERBASIS WAKTU TANGGAL

    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
    }

KELUARAN

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

0

PERBEDAAN WAKTU EPOCH MENGGUNAKAN MOMENTJS :

Untuk Mendapatkan Perbedaan antara dua zaman:

Sintaksis: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

Perbedaan dalam Jam: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

Perbedaan dalam hitungan menit: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

Catatan: Anda dapat menghapus .toFixed()jika Anda membutuhkan nilai yang tepat.

Kode:

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')

Lihat contoh kerja di sini: https://repl.it/repls/MoccasinDearDimension

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.