Javascript момент вычитать обеденное время из рабочих часов - PullRequest
0 голосов
/ 20 апреля 2020

Я хочу вычесть часы обеда из разности даты и времени. Как это может быть достигнуто?

var StartTime = moment(theList[i].start_time, "YYYY-MM-DD HH:mm:ss"); //2020-04-01 08:00:00.0
    var EndTime = moment(theList[i].end_time, "YYYY-MM-DD HH:mm:ss"); //2020-04-01 18:00:00.0
    var Lunch = moment(theList[i].lunch_time, "HH:mm:ss"); //00:30:00
    var lunchTimeMs= moment(Lunch,"HH:mm:ss");

    var ms = moment(EndTime,"YYYY-MM-DD HH:mm:ss").diff(moment(StartTime,"YYYY-MM-DD HH:mm:ss"));
    var d = moment.duration(ms);
    ms = moment().subtract(lunchTimeMs); //This gives wrong result


    var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

    console.log("Total time " + i + " row" + s);

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Он использует Момент JS.

Насколько я понял, проблема в том, что у него есть только дата и время для манипулирования в формате, подобном: dd.mm.YYYY HH:ii:ss.

Я рекомендовал перенести дату и время ответа сервера в метку времени, используя JS. Гораздо проще управлять датой и временем, если вы используете метку времени.

ОБНОВЛЕНИЕ

Добавление сюда моего "видения" JS управления датами (мой скрипка ). Не стесняйтесь улучшать это!

const date2timestamp= function(str){
	_tmp = str.split(" ");
	if(_tmp){
		date_arr = ( _tmp[1] ? _tmp[0].split("-") : null );
		time_arr = ( _tmp[1] ? _tmp[1].split(":") : _tmp[0].split(":") );
		if(!date_arr) {
			const today = new Date(); 
			_date = Date.UTC(today.getFullYear(), today.getMonth(), today.getDate(), time_arr[0], time_arr[1], time_arr[2]);
    	}
		else {
			_date = Date.UTC(date_arr[0], date_arr[1]-1, date_arr[2], time_arr[0], time_arr[1], time_arr[2]);
		}
		date_obj = new Date(_date);
		return date_obj.getTime()/1000;
	}
	return false;
}

document.write(
	date2timestamp("2020-04-20 08:00:00")+"<br/>",
	date2timestamp("2020-04-20 17:00:00")+"<br/>",
	date2timestamp("00:03:00")
);

А теперь у вас есть метки времени. Когда вы вычитаете, вы знаете, что 1 мин = 60 с c, поэтому результат равен ((7*60)+30)*60 = date2timestamp("2020-04-20 17:00:00")-date2timestamp("2020-04-20 17:00:00")-(30*60)

БОЛЬШЕ ОБНОВЛЕНИЙ

Но, читая о моменте. js немного, есть еще более простой способ. Руководство для вычитания говорит:

moment().subtract(1, 'seconds');

это означает, что вы должны фактически перевести период запуска в секунды, а затем добавить его в вычитание: moment().subtract((30*60), 'seconds') или просто добавить (для test) 'миллисекунда' как вторая часть вычитания:

...
ms = moment().subtract(lunchTimeMs, 'milliseconds');
// or use that
ms = moment().subtract(lunchTimeMs/1000, 'seconds);
...
1 голос
/ 20 апреля 2020

Попробуйте это:

    var StartTime = moment(theList[i].start_time, "YYYY-MM-DD HH:mm:ss");
    var EndTime = moment(theList[i].end_time, "YYYY-MM-DD HH:mm:ss");
    var Lunch = moment(theList[i].lunch_time, "HH:mm:ss");
    var ms = moment(EndTime,"YYYY-MM-DD HH:mm:ss").diff(moment(StartTime,"YYYY-MM-DD HH:mm:ss"));
    moment(ms).subtract(Lunch);
...