Nhận chênh lệch giờ giữa hai ngày trong Moment Js


385

Tôi có thể nhận được sự khác biệt giữa hai ngày bằng cách sử dụng MomentJ như sau:

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

Tuy nhiên, tôi cũng muốn hiển thị giờ khi áp dụng (chỉ khi> = 60 phút trôi qua).

Tuy nhiên, khi tôi cố gắng truy xuất thời lượng giờ bằng cách sử dụng như sau:

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

nó đang trả về giờ hiện tại và không phải là số giờ giữa hai ngày.

Làm thế nào để tôi có được sự khác biệt về giờ giữa hai khoảnh khắc?

Câu trả lời:


611

Bạn đã gần. Bạn chỉ cần sử dụng duration.asHours()phương thức (xem tài liệu ).

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

8
Có nên không startTime.diff(end, 'hours', true);? Thời lượng.asHours (); sẽ trả lại 1 nếu là 25 giờ trước.
Daniel F

29
@DanielF Nếu bạn đang sử dụng MomentJS> = phiên bản 2.0.0, bạn có thể sử dụng .diff(), vâng. Ngoại trừ end.diff(startTime, 'hours', true)việc lấy số giờ là số dương. Tuy nhiên, điểm thứ hai của bạn là không chính xác. duration.hours()sẽ trả lại 1 nếu là 25 giờ trước, nhưng duration.asHours()sẽ trả lại 25.
GregL

5
@GregL Tôi đứng sửa jsfiddle.net/qxxr1Lyr Tôi đã sử dụng sai .hours()phương pháp mà không nhận thấy.
Daniel F

5
Làm thế nào điều này có nhiều phiếu bầu như vậy khi tất cả những gì nó làm là khiến OP nhận ra một lỗi đánh máy mà hầu hết các IDE sẽ tiết lộ cho bạn bằng mọi cách ( imgur.com/a/ikyayIL ). Đại diện SO là người đầu tiên mặc quần áo đẹp nhất trong khi những người khác làm việc cho phế liệu smh. Oh bạn đã sửa một lỗi đánh máy .. đây là đại diện
4,7k

3
@zanderwar Tôi hiểu sự thất vọng của bạn, nhưng đây là một câu hỏi 5 tuổi. Hôm nay những câu hỏi và câu trả lời như vậy sẽ không bay được.
Jean-François Fabre

219

Khối mã sau đây cho thấy cách tính chênh lệch số ngày giữa hai ngày bằng 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
Ít nhất khối mã của anh ấy đã hiển thị tất cả các biến được sử dụng không giống như câu trả lời được chấp nhận hoặc câu hỏi. Nếu ai đó muốn bỏ phiếu cho họ, nên bỏ phiếu cho câu hỏi vì đây là một khối mã chưa hoàn chỉnh để bắt đầu. Liệu khối mã đó thực sự cần giải thích?
Jordan Papaleo

23
Câu trả lời này đủ rõ ràng và thậm chí còn đầy đủ hơn đối với tôi so với câu trả lời được chấp nhận ở trên, nơi bạn không biết 'kết thúc' và 'startTime' đến từ đâu ... Cảm ơn rất nhiều vì câu trả lời của bạn Raj!
Pierre

3
Bây giờ đơn giản hơn một chút var now = moment();. Xem khoảnh khắcjs.com/docs/#/parsing/now
rob3c

161

Hoặc bạn có thể làm đơn giản:

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

tài liệu: ở đây


12
Làm thế nào tôi có thể hiển thị tất cả các giờ, phút và giây cùng nhau? Giống như HH: MM: SS?
Faizan Saiyed

16

Tất cả những gì bạn cần làm là chuyển vào hourslàm tham số thứ hai cho hàm diff.

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

Tài liệu: https://momentjs.com/docs/#/displaying/difference/

Thí dụ:

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

Có một momentphương pháp tuyệt vời được gọi là fromNow()sẽ trả lại thời gian từ một thời điểm cụ thể ở dạng dễ đọc của con người, như thế này:

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

Hoặc nếu bạn muốn giữa hai ngày cụ thể, bạn có thể sử dụng:

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

Lấy từ Tài liệu:


7

Tôi biết điều này là cũ, nhưng đây là một giải pháp lót:

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

Nơi bắt đầukết thúc là các đối tượng khoảnh khắc.

Thưởng thức!


... đã được đề xuất bởi Sebastián Lara vào năm 2016
YakovL

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

Như bạn có thể thấy, ngày bắt đầu và ngày kết thúc cần phải là đối tượng thời điểm để phương thức này hoạt động.


2
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thứclý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
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
Xóa tất cả các chuyển đổi không cần thiết từ / sang biểu diễn chuỗi của các khoảnh khắc và bạn sẽ kết thúc với câu trả lời được chấp nhận.
Vladimir M

1
Tại sao các dấu gạch dưới bổ sung khi bắt đầu tên biến?
zenw0lf

1

Trong trường hợp của tôi, tôi muốn giờ và phút:

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

Để biết thêm thông tin tham khảo các tài liệu chính thức .


0

Nếu bạn muốn tổng số phút giữa hai ngày trong ngày khôn ngoan hơn có thể mã dưới đây sẽ giúp bạn đầy đủ Ngày bắt đầu: 2018-05-04 02:08:05 , Ngày kết thúc: 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);
});
}

Đầu ra

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

Tôi biết điều này đã được trả lời nhưng trong trường hợp bạn muốn một cái gì đó đệ quy và chung chung hơn và không dựa vào thời điểm fromNowbạn có thể sử dụng chức năng này do tôi tạo. Tất nhiên bạn có thể thay đổi logic của nó để điều chỉnh nó theo nhu cầu của bạn để hỗ trợ nhiều năm và giây.

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
Bạn có thể thêm một số lời giải thích thay vì chỉ đăng mã?
Paul Floyd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.