รับความแตกต่างชั่วโมงระหว่างสองวันใน Moment Js


385

ฉันสามารถรับความแตกต่างระหว่างสองเดทโดยใช้ MomentJs ดังนี้:

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

อย่างไรก็ตามฉันต้องการแสดงชั่วโมงเมื่อใช้งานได้ (เฉพาะเมื่อ> = 60 นาทีผ่านไป)

อย่างไรก็ตามเมื่อฉันพยายามดึงชั่วโมงระยะเวลาโดยใช้สิ่งต่อไปนี้:

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

มันจะส่งคืนชั่วโมงปัจจุบันและไม่ใช่จำนวนชั่วโมงระหว่างวันที่สองวัน

ฉันจะได้รับความแตกต่างในชั่วโมงระหว่างสองช่วงเวลาได้อย่างไร

คำตอบ:


611

คุณสนิท คุณเพียงแค่ต้องใช้duration.asHours()วิธีการ (ดูเอกสาร )

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

8
ไม่ควรstartTime.diff(end, 'hours', true);หรือ The Duration.asHours (); จะคืนค่า 1 ถ้าเป็น 25 ชั่วโมงก่อน
Daniel F

29
@DanielF หากคุณใช้ MomentJS> = เวอร์ชัน 2.0.0 คุณสามารถใช้.diff()ใช่ ยกเว้นว่าจะได้end.diff(startTime, 'hours', true)รับจำนวนชั่วโมงเป็นจำนวนบวก อย่างไรก็ตามจุดที่สองของคุณไม่ถูกต้อง duration.hours()จะกลับ 1 ถ้าเป็น 25 ชั่วโมงที่แล้ว แต่duration.asHours()จะกลับ 25
GregL

5
@GregL ฉันยืนแก้ไขjsfiddle.net/qxxr1Lyrฉันต้องใช้.hours()วิธีที่ผิดพลาดโดยไม่สังเกตเห็น
Daniel F

5
สิ่งนี้มีการลงคะแนนเสียงมากมายอย่างไรเมื่อทั้งหมดทำให้ OP ตระหนักถึงการพิมพ์ผิดที่ IDE ส่วนใหญ่จะเปิดเผยให้คุณทราบต่อไป ( imgur.com/a/ikyayIL ) ตัวแทนจึงเป็นคนแรกที่แต่งตัวดีที่สุดในขณะที่คนอื่นทำงานเพื่อเรื่องที่สนใจ smh โอ้คุณพิมพ์ผิด .. นี่คือตัวแทน
4.7k

3
@zanderwar ฉันเข้าใจความคับข้องใจของคุณ แต่นี่เป็นคำถามอายุ 5 ปี วันนี้คำถามและคำตอบดังกล่าวจะไม่บิน
Jean-François Fabre

218

บล็อครหัสต่อไปนี้แสดงวิธีการคำนวณความแตกต่างในจำนวนวันระหว่างสองวันโดยใช้ 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
อย่างน้อยบล็อคโค้ดของเขาแสดงตัวแปรทั้งหมดที่ใช้งานไม่เหมือนกับคำตอบที่ยอมรับหรือคำถาม หากใครบางคนต้องการลงคะแนนพวกเขาควรลงคะแนนคำถามเพราะมันเป็นบล็อกรหัสที่ไม่สมบูรณ์ในการเริ่มต้น การบล็อกโค้ดนั้นต้องการคำอธิบายจริง ๆ หรือไม่?
Jordan Papaleo

23
คำตอบนี้ชัดเจนเพียงพอและสมบูรณ์ยิ่งขึ้นสำหรับฉันมากกว่าคำตอบที่ยอมรับข้างต้นซึ่งคุณไม่ทราบว่า 'จบ' และ 'เวลาเริ่มต้น' มาจากไหน ... ขอบคุณมากสำหรับคำตอบของคุณราชา!
Pierre

3
มันเป็นเรื่องเล็ก ๆ น้อย ๆ var now = moment();ที่เรียบง่ายที่จะได้รับในขณะนี้โดย ดูmomentjs.com/docs/#/parsing/now
rob3c

161

หรือคุณสามารถทำได้ง่ายๆ

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

เอกสาร: ที่นี่


11
ฉันจะแสดงทุกชั่วโมงนาทีและวินาทีพร้อมกันได้อย่างไร ชอบ HH: MM: SS เหรอ?
Faizan Saiyed

16

สิ่งที่คุณต้องทำคือส่งhoursพารามิเตอร์ตัวที่สองไปยังฟังก์ชั่น

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

เอกสาร: https://momentjs.com/docs/#/displaying/difference/

ตัวอย่าง:

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

มีmomentวิธีการที่ยอดเยี่ยมที่เรียกfromNow()ว่าจะคืนค่าเวลาจากเวลาที่ระบุในรูปแบบที่มนุษย์สามารถอ่านได้เช่นนี้

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

หรือถ้าคุณต้องการระหว่างวันที่สองวันคุณสามารถใช้:

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

นำมาจากเอกสาร:


7

ฉันรู้ว่านี่เก่า แต่นี่เป็นวิธีแก้ปัญหาเดียว:

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

ที่เริ่มต้นและสิ้นสุดเป็นวัตถุช่วงเวลา

สนุก!


... เสนอโดยSebastián Lara ในปี 2559
YakovL

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

อย่างที่คุณเห็นวันที่เริ่มต้นและวันที่สิ้นสุดนั้นจะต้องเป็นวัตถุเวลาสำหรับวิธีนี้ในการทำงาน


1
ในขณะที่รหัสนี้อาจจะตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและเหตุผลที่จะแก้ปัญหาที่เกิดขึ้นจะปรับปรุงคำตอบเป็นระยะยาวคุ้มค่า
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
ลบการแปลงที่ไม่จำเป็นทั้งหมดออกจาก / เป็นการนำเสนอช่วงเวลาและคุณจะได้คำตอบที่ยอมรับได้
Vladimir M

1
ทำไมขีดเส้นใต้พิเศษที่จุดเริ่มต้นของชื่อตัวแปร?
zenw0lf

1

ในกรณีของฉันฉันต้องการชั่วโมงและนาที:

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

สำหรับข้อมูลเพิ่มเติมโปรดดูที่อย่างเป็นทางการเอกสาร


0

หากคุณต้องการจำนวนนาทีรวมระหว่างวันที่สองวันในวันที่ฉลาดกว่าโค้ดด้านล่างจะช่วยให้คุณเริ่มวันที่: 2018-05-04 02:08:05 , วันที่สิ้นสุด: 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);
});
}

เอาท์พุต

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

ฉันรู้ว่านี่ตอบแล้ว แต่ในกรณีที่คุณต้องการสิ่งที่ซ้ำและทั่วไปมากขึ้นและไม่พึ่งพาช่วงเวลาที่fromNowคุณสามารถใช้ฟังก์ชั่นนี้ฉันสร้างขึ้น แน่นอนคุณสามารถเปลี่ยนตรรกะเพื่อปรับให้เข้ากับความต้องการของคุณเพื่อรองรับปีและวินาที

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
คุณสามารถเพิ่มคำอธิบายมากกว่าแค่เพียงการโพสต์โค้ดได้ไหม
พอลฟลอยด์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.