Lấy chênh lệch múi giờ giữa hai mốc thời gian


246

Tôi biết tôi có thể làm bất cứ điều gì và một số Ngày tuyệt vời hơn với khoảnh khắc. Nhưng thật xấu hổ, tôi đang gặp khó khăn khi cố gắng làm điều gì đó có vẻ đơn giản: nhận được sự khác biệt giữa 2 lần.

Thí dụ:

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

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

những gì tôi đã cố gắng:

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  

Tôi không hiểu "10" đó là gì. Tôi sống ở Brazil, vì vậy chúng tôi là utc-0300 nếu điều đó có liên quan.

Kết quả moment.duration(now.diff(then))là một khoảng thời gian với các giá trị bên trong chính xác:

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

Vì vậy, tôi đoán câu hỏi của tôi là: làm thế nào để chuyển đổi Thời lượng cho một khoảng thời gian? Tôi chắc chắn có thể sử dụng

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

nhưng tôi cảm thấy rằng có một cái gì đó thanh lịch hơn mà tôi hoàn toàn thiếu.

cập nhật
nhìn gần hơn, trong ví dụ trên nowlà:

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

moment(moment.duration(now.diff(then)))là:

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

Tôi không chắc tại sao giá trị thứ hai là trong Giờ ban ngày (-0200) ... nhưng tôi chắc chắn rằng tôi không thích ngày :(

cập nhật 2

tốt, giá trị là -0200 có lẽ vì 31/12/1969 là một ngày mà thời gian ban ngày đang được sử dụng ... vì vậy đó là.


2
"nhưng tôi chắc chắn rằng tôi không thích ngày tháng": P Bạn đã bao giờ đọc cái này chưa: gậtatime.org / unurdy / userguide / trivia.html ?
Boris Callens

Câu trả lời:


366

Cách tiếp cận này sẽ chỉ hoạt động khi tổng thời lượng dưới 24 giờ:

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"

Nếu bạn có 24 giờ trở lên, giờ sẽ được đặt lại về 0 với cách tiếp cận ở trên, vì vậy nó không lý tưởng.

Nếu bạn muốn nhận được phản hồi hợp lệ trong thời gian từ 24 giờ trở lên, thì bạn sẽ phải làm một cái gì đó như thế này:

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"

Lưu ý rằng tôi đang sử dụng thời gian utc như một phím tắt. Bạn có thể rút ra d.minutes()d.seconds()riêng rẽ, nhưng bạn cũng sẽ phải zeropad chúng.

Điều này là cần thiết bởi vì khả năng định dạng một durationphản đối hiện không có trong khoảnh khắc.js. Nó đã được yêu cầu ở đây . Tuy nhiên, có một plugin của bên thứ ba được gọi là định dạng thời lượng-thời gian dành riêng cho mục đích này:

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 - Tôi rõ ràng nói rằng nó sẽ không hoạt động trong thời gian 24 giờ hoặc lâu hơn.
Matt Johnson-Pint

1
Điều này làm việc tốt. Khoảnh khắc là một thư viện thanh lịch đến nỗi nó làm tôi ngạc nhiên, nó không có cách đơn giản hơn nhưng có lẽ những gì tôi đang làm không quá "bình thường". Tôi có thể sẽ không có nhiều hơn 24 giờ nhưng thật tuyệt khi có tùy chọn nếu điều đó xảy ra. Cảm ơn bạn đã giúp đỡ.
Leo

69

Vấn đề của bạn là chuyển kết quả của khoảnh khắc.duration () trở lại khoảnh khắc () trước khi định dạng nó; điều này dẫn đến khoảnh khắc () diễn giải nó như một thời gian liên quan đến kỷ nguyên Unix.

Nó không cung cấp cho bạn chính xác định dạng bạn đang tìm, nhưng

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

sẽ cung cấp cho bạn một định dạng hữu ích như "40 phút". Nếu bạn thực sự quan tâm đến định dạng cụ thể đó, bạn sẽ phải tự xây dựng một chuỗi mới. Một cách rẻ tiền sẽ là

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

nơi var diff = moment.duration(now.diff(then)). Điều này không cung cấp cho bạn phần đệm bằng 0 trên các giá trị một chữ số. Đối với điều đó, bạn có thể muốn xem xét một cái gì đó như underscore.opes - mặc dù có vẻ như một chặng đường dài để đi chỉ cho một vài số không. :)


4
bạn sẽ phải sử dụng asHoursthay vì hoursvà rút ra số thập phân. Nếu không, nó sẽ có cùng một vấn đề bạn bắt gặp trong câu trả lời của tôi. :)
Matt Johnson-Pint

humanize () cho một liên lạc tốt đẹp nhưng cuối cùng tôi đã sử dụng đề xuất Matt. Cảm ơn vì tiền hỗ trợ.
Leo

Cảm ơn bạn đã chỉ ra rằng, @MattJohnson - tôi thậm chí còn không nhận ra .asHours và .hours khác nhau, nghĩ rằng cái này chỉ là một tên ngắn hơn cho cái khác, nhưng khi kiểm tra kỹ hơn, bạn đã đúng.
TML

2
Lưu ý, sẽ là khôn ngoan khi sử dụng: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')để có được kết quả mong muốn. không có số thập phân trong phần đầu tiên
KyleM


30

Nếu bạn muốn sự khác biệt của hai dấu thời gian thành tổng số ngày, giờ và phút, không phải trong tháng và năm.

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 chứa 2 tháng, 23 ngày, 23 giờ và 20 phút. Nhưng chúng ta chỉ cần kết quả trong vài ngày, giờ và phút nên giải pháp đơn giản là:

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.

Kết quả cuối cùng sẽ là: 84 ngày, 23 giờ, 20 phút.


19

Khi bạn gọi diff, Moment.js sẽ tính toán sự khác biệt tính bằng mili giây. Nếu một phần nghìn giây được truyền vào duration, nó được sử dụng để tính thời lượng là chính xác. Tuy nhiên. khi bạn chuyển cùng một mili giây cho moment()nó, nó sẽ tính ngày là mili giây từ (sau) thời gian epoch / unix là ngày 1 tháng 1 năm 1970 (nửa đêm UTC / GMT). Đó là lý do tại sao bạn nhận được 1969 là năm cùng với giờ sai.

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

Vì vậy, tôi nghĩ rằng đây là cách bạn nên làm vì khoảnh khắc.js không cung cấp formatchức năng trong thời gian. Hoặc bạn có thể viết một trình bao bọc đơn giản để làm cho nó dễ dàng hơn / đẹp hơn.


11

Điều này sẽ làm việc tốt.

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

Giải pháp tốt hơn! :)
JHenry

Giải pháp tốt nhất từ ​​trước đến nay
Alaksandar Jesus Gene

9

Nếu chúng ta chỉ muốn hh: mm: ss, chúng ta có thể sử dụng một hàm như thế:

//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
Tôi không thấy việc sử dụng khoảnh khắc ở bất cứ đâu trong bạn trả lời.
Joel

4

Dùng cái này,

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

    var aa = duration.asHours();

3

Thay vì

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

Tốt hơn là làm

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

2

Trong ES8 sử dụng khoảnh khắc, bây giờ và bắt đầu là đối tượng khoảnh khắc.

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

Bản đánh máy: sau đây nên hoạt động,

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

Tôi tạo một hàm đơn giản với bản thảo

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)

để tạo javascript https://www.typescriptlang.org/play/index.html


0

Thời gian trong = 06: 38, Thời gian hoạt động = 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

NGÀY THỜI GIAN DỰA VÀO

    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
    }

ĐẦU RA

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

0

SỰ KHÁC BIỆT THỜI GIAN EPOCH SỬ DỤNG MOMENTJS :

Để có sự khác biệt giữa hai lần kỷ nguyên:

Cú pháp: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

Sự khác biệt về giờ: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

Sự khác biệt trong vài phút: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

Lưu ý: Bạn có thể xóa .toFixed()nếu bạn cần các giá trị chính xác.

Mã số:

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

Tham khảo ví dụ làm việc tại đây: https://repl.it/repls/MoccasinDearDimension

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.