2016-11-15 2 views
1

SO habe ich 2 Datetime-Objekte.Zeitunterschied zwischen 2 Datetime Moment

Mein Ziel ist es, die Gesamtstunden zwischen (9.00 bis 17.00 Uhr) zu bekommen, angesichts der heutigen und späteren Zeiten.

resultierende Antwort shud 1 Stunde sein. (da ich nur über den Zeitbereich betroffen bin, der zwischen 9 AM-5 PM fällt)

resultierende Antwort sollte 8 Stunden sein.

ist der beste Weg, um dies zu erreichen mit der Diff-Funktion im Moment und stripping die Stunde aus und Berechnung einzelner Anwendungsfälle (wenn Startzeit weniger als 9 AM/Startzeit größer als 9AM). ähnlich Endzeit (weniger als 5 PM/größer als 5 PM) usw.?

Auch wie dieser Fall zu bewältigen, wo

now = Nov 15 9:00AM 
later = Nov 18 2:00PM 

resultierende Antwort shud sein,

8 (nov 15) +8 (November 16) +8 (November 17) + 5 (November 18) = 29hrs

Antwort

1

Hier arbeitet Lösung

var now = moment("15 Nov 2016, 9:00:00 am", "DD MMM yyyy, h:mm:ss a").toDate(); 
 
var later = moment("18 Nov 2016, 2:00:00 pm", "DD MMM yyyy, h:mm:ss a").toDate(); 
 

 
function getWorkingHours(now, later) { 
 
\t var hoursToday = 0; 
 

 
\t var workingHourStart = 9; 
 
\t var workingHourEnd = 17;//5pm 
 
\t var workDuration = workingHourEnd - workingHourStart; 
 
\t 
 
\t if(workingHourEnd - getHours(now) > 0) { 
 
\t \t hoursToday = (workingHourEnd - getHours(now)); 
 
\t \t hoursToday = (hoursToday > workDuration) ? workDuration : hoursToday; 
 
\t } 
 

 
\t var hoursLater = 0; 
 

 
\t if(getHours(later) - workingHourStart > 0) { 
 
\t \t hoursLater = (getHours(later) - workingHourStart); 
 
\t \t hoursLater = (hoursLater > workDuration) ? workDuration : hoursLater; 
 
\t } 
 

 
\t var actualDiffHours = (later.getTime() - now.getTime())/(1000 * 60 * 60); 
 
\t var actualHoursInBetween = actualDiffHours - (24 - getHours(now)) - getHours(later); 
 

 
\t var workingHoursInBetween = (actualHoursInBetween/24) * 8; 
 
\t 
 
\t return hoursToday + workingHoursInBetween + hoursLater; 
 
} 
 

 
function getHours(date) { 
 
\t var hours = date.getHours() + date.getMinutes()/60 + date.getSeconds()/3600 + date.getMilliseconds()/3600/1000; 
 
\t return hours; 
 
} 
 

 
console.log(getWorkingHours(now, later));
<script src="http://momentjs.com/downloads/moment.min.js"></script>

0

Komplizierte ... Funktion GetActiveHours berechnet alle aktiven Slots zwischen Start- und Enddatum, beide inklusive, und entfernt dann die fehlenden Stunden am Anfang des Startdatums und am Ende des Enddatums.

var getDateObject = function (date) { 
    if (date && date.constructor.name == "Array") { 
    while (date.length < 7) {date.push(0);} 
    date = new Date(date[0], date[1], date[2], date[3], date[4], date[5], date[6]); 
    } else if (typeof date == 'string' || typeof date == 'number') { 
    date = new Date(date); 
    } 
    return date; 
}; 

var trimDate = function (date, period) { 
    var periods = ['second', 'minute', 'hour', 'day']; 
    period = periods.indexOf(period); 
    if (typeof date != 'number') {date = getDateObject(date).getTime();} 
    date = Math.floor(date/1000); 
    if (period > 0) {date = Math.floor(date/60);} 
    if (period > 1) {date = Math.floor(date/60);} 
    if (period > 2) {date = Math.floor(date/24);} 
    return new Date(date*24*60*60*1000); 
}; 

var getOffset = function (date) {return getDateObject(date).getTimezoneOffset()*60*1000;}; 

var addOffset = function (date) { 
    date = getDateObject(date); 
    return new Date(date.getTime()+getOffset(date)); 
}; 

var getActiveHours = function (iniDateTime, endDateTime, startHour, finishHour) { 
    var hourMs = 60*60*1000; // Define daily active hours 0-24 (decimal 17.5 = 5:30pm): 
    if (startHour == null) {startHour = 9;} 
    if (finishHour == null) {finishHour = 17;} 
    startHour *= hourMs; finishHour *= hourMs; 
    iniDateTime = getDateObject(iniDateTime).getTime(); 
    endDateTime = getDateObject(endDateTime).getTime(); 
    var iniDayTime = addOffset(trimDate(iniDateTime, 'day')).getTime(); 
    var endDayTime = addOffset(trimDate(endDateTime, 'day')).getTime(); 
    var totalHoursMs = (endDayTime-iniDayTime+24*hourMs)*(finishHour-startHour)/hourMs/24; 
    var iniHoursNotInMs = iniDateTime-iniDayTime-startHour; 
    var endHoursNotInMs = endDayTime+finishHour-endDateTime; 
    return (totalHoursMs-iniHoursNotInMs-endHoursNotInMs)/hourMs; 
}; 

console.log(Math.round(getActiveHours('2016-09-13 11:45:38', '2016-09-15 15:30:25'))); // 20 // Use Math round or floor 
1

Dies sollte die Arbeit machen:

const now = moment(new Date(2016, 11, 15, 9, 0, 0)); 
 
const then = moment(new Date(2016, 11, 18, 14, 0, 0)); 
 

 
function calDiff(now, then) { 
 
    if (now.hour() < 9) { 
 
    now.hour(9); 
 
    } 
 

 
    if (then.hour() > 17) { 
 
    then.hour(17); 
 
    } 
 

 
    const total = then.diff(now, 'hours'); 
 

 
    const day = Math.floor(total/24); 
 
    
 
    return total - (16 * day); 
 
} 
 

 
console.log(calDiff(now, then));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment.min.js"></script>

0

ich dies schreibe eine Weile zurück, hatte begonnen, als ich die Frage zum ersten Mal sah, bekam aber gefangen. Meine Antwort ist der von Khang sehr ähnlich, aber wir haben einen bestimmten Abschnitt ein wenig anders gemacht.

Die Grundidee hinter dem Code ist, dass es zwei Momentobjekte benötigt. Wenn die Startstunden weniger als neun sind, setzen wir sie auf neun, und wenn die Endstunden größer als 17 sind, setzen wir sie auf 17.

Als nächstes erhalten wir den Unterschied zwischen den zwei Objekten in Tagen . Für jeden Tag wissen wir, dass es 8 Stunden für die Person gibt. Ich verschiebe dann das Datum des Anfangstages auf den Endtag und nimm die Stunden zwischen ihnen.

Die Idee dahinter ist, dass, wenn beide Zeiten innerhalb der gleichen Tage sind, es 0 Tage Unterschied gibt. Wenn es 1 ist, erhalten wir insgesamt 8 Stunden unabhängig davon, wo wir am Tag anfangen. Ich die einzigen Fälle sind die Dinge nicht getestet sind, wo die Startzeit größer ist als die Endzeit ist (ich werde es so schnell wie möglich testen und bearbeitet machen, wenn es alles, was ich ändern müssen)

bearbeiten

es wurde in der Tat ein Problem, wenn die Startzeit nach der Endzeit (Stunden) war. Dies wurde durch Hinzufügen einer If-Anweisung behoben.

$(function() { 
 
    function getActiveHours(start, end) { 
 
    if (start.hours() < 9) start.hours(9); 
 
    if (end.hours() > 17) end.hours(17); 
 
    //These two if's should remove most of the issues when we are doing basic work 
 
    var days = end.diff(start, 'days'); 
 
    if (days == 0 && (end.date() - start.date()) == 1) days = 1; 
 
    var hours = (days * 8); //gets the hours 
 
    start.date(end.date()); 
 
    var diff = end.diff(start, 'hours'); 
 
    return hours + diff; 
 
    } 
 
    var start = moment([2016, 10, 15, 9, 0, 0]); 
 
    var end = moment([2016, 10, 18, 14, 0, 0]); 
 

 
    $('#results').html('Total hours worked from ' + start.format('MM-DD-YYYY @ hh:mm:ss') + ' to ' + end.format('MM-DD-YYYY @ hh:mm:ss') + ' is ' + getActiveHours(start, end)) 
 

 
});
<div id="results"></div>

Verwandte Themen