दो डेटासेट के बीच समय का अंतर प्राप्त करें


246

मुझे पता है कि मैं कुछ भी कर सकता हूं और कुछ और एन्वोलेटिंग डेट्स पल-पल के साथ कर सकता हूं। लेकिन शर्म की बात है, मैं एक कठिन समय कुछ ऐसा करने की कोशिश कर रहा हूं जो सरल लगता है: 2 बार के बीच अंतर प्राप्त करना।

उदाहरण:

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

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

मैंने क्या कोशिश की:

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  

मुझे समझ में नहीं आ रहा है कि वहां "10" क्या है। मैं ब्राज़ील में रहता हूँ, इसलिए अगर यह प्रासंगिक है तो हम utc-0300 हैं।

इसका परिणाम moment.duration(now.diff(then))सही आंतरिक मूल्यों के साथ एक अवधि है:

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

इसलिए, मुझे लगता है कि मेरा सवाल यह है: एक संवेग की अवधि कैसे बदलें एक समय अंतराल के लिए? मुझे यकीन है कि उपयोग कर सकते हैं

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

लेकिन मुझे लगता है कि कुछ और सुरुचिपूर्ण है जो मुझे पूरी तरह याद आ रही है।

अपडेट को
नज़दीक से देखना, उपरोक्त उदाहरण में nowहै:

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

और moment(moment.duration(now.diff(then))):

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

मुझे यकीन नहीं है कि डेलाइट टाइम (-0200) में दूसरा मूल्य क्यों है ... लेकिन मुझे यकीन है कि मुझे तारीखें पसंद नहीं हैं :(

अद्यतन २

खैर, मान -0200 शायद इसलिए है क्योंकि 31/12/1969 एक ऐसी तारीख थी जहां दिन के समय का उपयोग किया जा रहा था ... इतना ही।


2
"लेकिन मुझे यकीन है कि मुझे तारीखें पसंद नहीं हैं": क्या आपने कभी इसे पढ़ा: nodatime.org/unstable/userguide/trivia.html ?
बोरिस

जवाबों:


367

यह दृष्टिकोण केवल तभी काम करेगा जब कुल अवधि 24 घंटे से कम हो:

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 घंटे या अधिक हैं, तो घंटे उपरोक्त दृष्टिकोण के साथ शून्य पर रीसेट हो जाएंगे, इसलिए यह आदर्श नहीं है।

यदि आप 24 घंटे या उससे अधिक की अवधि के लिए वैध प्रतिक्रिया प्राप्त करना चाहते हैं, तो आपको इसके बजाय कुछ ऐसा करना होगा:

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 समय का उपयोग कर रहा हूं। आप बाहर d.minutes()और d.seconds()अलग-अलग खींच सकते हैं , लेकिन आपको उन्हें फिर से चलाना होगा।

यह आवश्यक है क्योंकि durationआपत्ति को प्रारूपित करने की क्षमता वर्तमान में नहीं है। यह यहाँ अनुरोध किया गया है । हालाँकि, एक तृतीय-पक्ष प्लगइन है जिसे क्षण-अवधि-प्रारूप कहा जाता है जो विशेष रूप से इस उद्देश्य के लिए है:

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
@ टीएमएल - मैंने स्पष्ट रूप से कहा कि यह 24 घंटे या उससे अधिक अवधि के लिए काम नहीं करेगा।
मैट जॉनसन-पिंट

1
यह ठीक काम किया। गतिज एक ऐसा सुंदर पुस्तकालय है जो मुझे आश्चर्यचकित करता है कि इसके पास अधिक सरल तरीका नहीं है लेकिन शायद मैं जो कर रहा हूं वह इतना "सामान्य" नहीं है। मेरे पास शायद 24 घंटे से अधिक नहीं होगा, लेकिन अगर ऐसा होता है तो विकल्प होना अच्छा है। आपकी सहायता के लिए धन्यवाद।
सिंह

69

आपकी समस्या यह है कि स्वरूपण से पहले क्षण (अवधि) वापस पल में () के परिणाम से गुजर रहा है; यह पल में परिणाम () यह यूनिक्स युग के सापेक्ष एक समय के रूप में व्याख्या करता है।

यह आपको वह प्रारूप नहीं देता है जिसकी आप तलाश कर रहे हैं, लेकिन

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

आपको "40 मिनट" जैसा उपयोगी प्रारूप देगा। यदि आप वास्तव में उस विशिष्ट प्रारूपण के लिए उत्सुक हैं, तो आपको स्वयं एक नया स्ट्रिंग बनाना होगा। एक सस्ता तरीका होगा

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

जहां var diff = moment.duration(now.diff(then))। यह आपको एकल अंकों के मूल्यों पर शून्य-पैडिंग नहीं देता है। उसके लिए, आप कुछ अंडरस्कोर की तरह विचार कर सकते हैं। स्ट्रिंग - हालांकि यह कुछ अतिरिक्त शून्य के लिए जाने के लिए एक लंबा रास्ता तय करने जैसा लगता है। :)


4
आपको asHoursइसके बजाय उपयोग करना होगा hours, और दशमलव को खींचना होगा। अन्यथा यह वही समस्या होती जो आपने मेरे उत्तर में पकड़ी थी। :)
मैट जॉनसन-पिंट

humanize () एक अच्छा स्पर्श देता है लेकिन मैंने मैट सुझाव का उपयोग करके समाप्त कर दिया। पारितोषिक के लिए धन्यवाद।
सिंह

उस ओर इशारा करने के लिए धन्यवाद, @MattJohnson - मुझे भी एहसास नहीं हुआ था। .Hours और .hours अलग थे, सोचा था कि एक दूसरे के लिए सिर्फ एक छोटा नाम था, लेकिन करीब निरीक्षण पर, आप सही हैं।
TML

2
ध्यान दें, [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')वांछित परिणाम प्राप्त करने के लिए : उपयोग करना बुद्धिमानी होगी । पहले भाग में एक दशमलव के बिना
KyleM

63
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

मेरे लिए काम किया

Http://momentjs.com/docs/#/displaying/difference/ में और देखें


3
यह केवल दिनांक के लिए काम करता है। ओपी चाहता था कि समय में अंतर हो
apfz

यह सबसे सरल उपाय है जो काम करता है। हाँ, टाइमस्टैम्प के साथ भी।
फहीम

30

यदि आप दो टाइमस्टैम्प का अंतर कुल दिनों, घंटों और मिनटों में चाहते हैं, तो महीनों और वर्षों में नहीं।

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

फैल में 2 महीने, 23 दिन, 23 घंटे और 20 मिनट शामिल हैं। लेकिन हमें केवल दिनों, घंटों और मिनटों में परिणाम की आवश्यकता है इसलिए सरल उपाय है:

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.

अंतिम परिणाम होगा: 84 दिन, 23 घंटे, 20 मिनट।


19

जब आप कॉल करते हैं diff, तो क्षण.js मिलीसेकंड में अंतर की गणना करता है। यदि मिलीसेकंड को पारित किया जाता है duration, तो इसका उपयोग अवधि की गणना करने के लिए किया जाता है जो सही है। तथापि। जब आप एक ही मिलीसेकंड को पास करते हैं moment(), तो यह उस तारीख की गणना करता है , जो 1 जनवरी, 1970 (मध्यरात्रि यूटीसी / जीएमटी) से युगांतर (यूनिक्स) के बाद (बाद में) है। यही कारण है कि आपको गलत घंटे के साथ वर्ष के रूप में 1969 मिलता है।

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

इसलिए, मुझे लगता है कि इस तरह से आपको इसे पल भर में करना चाहिए। जेएस formatअवधि के लिए फ़ंक्शन की पेशकश नहीं करता है । या आप इसे आसान / आसान बनाने के लिए एक साधारण आवरण लिख सकते हैं।


11

यह ठीक काम करना चाहिए।

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

बेहतर समाधान! :)
जे। हेनरी

बेस्ट सॉल्यूशन कभी
अलकसंदर जीसस जीन

9

अगर हम केवल hh: mm: ss चाहते हैं, तो हम एक फंक्शन का उपयोग कर सकते हैं:

//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
मुझे आपके उत्तर में कहीं भी क्षण का उपयोग नहीं दिखता।
जोएल


3

के बजाय

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

करना बेहतर है

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

2

ES8 पल का उपयोग करते हुए, अब और क्षण वस्तुएं बनना शुरू करें।

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

टाइपस्क्रिप्ट: निम्नलिखित काम करना चाहिए,

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

मैं टाइपस्क्रिप्ट के साथ एक साधारण फ़ंक्शन बनाता हूं

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)

जावास्क्रिप्ट बनाने के लिए 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 आधारित है

    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
    }

आउटपुट

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

0

© समय की अवधि का उपयोग करने के लिए :

दो युगों के बीच अंतर प्राप्त करने के लिए:

वाक्य - विन्यास: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

घंटे में अंतर: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

मिनटों में अंतर: moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

नोट:.toFixed() यदि आपको सटीक मानों की आवश्यकता है, तो आप निकाल सकते हैं।

कोड:

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

यहां काम करने के उदाहरण देखें: https://repl.it/repls/MoccasinDearDimension

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.