我在计算以HH:mm字符串表示的三个时间值之间的时间(小时:分钟)差异时遇到了问题。
我正在计算一天中的工作时间,午餐时间和时间。
e.g。 var time_worked = time_out - lunch - time_in 或07:00 = 17:00 - 01:00 - 09:00
我熟悉php日期,但javascript日期对象很吓人!
代码:
var time_in = $(".time-in").val(); // 09:00
var time_out = $(".time-out").val(); // 17:00
var lunch = $(".lunch").val(); // 01:00
var time = time_out - lunch - time_in; // should be 07:00 or 7
答案 0 :(得分:5)
我建议稍微改变一下......考虑到你的三次,将所有时间转换为纯时间,然后按照几小时的时间进行数学计算。如果需要,您可以将小时数转回几分钟。
只需将分钟数除以60并将结果添加到小时部分,任何时间都可以变成小时。然后你的数学变得非常容易,除了你不必做基于时间的数学运算之外,你的表达式也是一样的。
如果您输入的内容为“hh:mm”,其中hh和mm为整数,那么您可以使用以下表达式计算纯小时:
var mytime = "hh:mm";
var temp = mytime.split(":");
var hours = temp[0] + (temp[1]/60);
编辑: 其他人已经注意到如果你处理夜班问题就会出现问题。一个简单的解决方案(不需要创建Date对象)是在结束时间小于开始时间时将24小时添加到开始时间(当然可以在“纯小时”域中完成)。
答案 1 :(得分:2)
我不足以帮助您,但由于您似乎使用了相关的时间,如果您的地方24小时工作,请特别注意跨越午夜的任何班次。星期四7:00 - 星期三23:00 = 8。
答案 2 :(得分:2)
使用getTime()
函数,它返回自1970年1月1日以来的毫秒数。所以你的代码看起来像:
var time_worked_ms = time_out.getTime() - lunch.getTime() - time_in.getTime();
time_worked_ms
将包含间隔的毫秒数。
答案 3 :(得分:2)
我认为你误解了你的问题领域。
具体来说,如果您正在尝试查找timeAtWork
,并且所有内容都被表示为时间对象(例如,自纪元以来的几秒钟内),那么您需要知道的四个重要时刻(您列出的三个[ startWork,endWork和startLunch]以及你错过的那个,[endLunch])。在这种情况下,您可以通过以下减法计算您想要的值,假设您正在使用的任何语言都支持添加/减去日期(对于JavaScript,请查看优秀的date.js库)
timeAtWork = (endWork-endLunch) + (startLunch-startWork)
或平等
timeAtWork = (endWork - startWork) - (endLunch - startLunch)
然而,听起来我有两个'时间'变量[startWork和endWork]和一个'timespan'变量[lunchDuration]。在这种情况下,lunchDuration类似于3600(一小时),但不代表真实的日期/时间组合。
在这种情况下,lunchDuration === (endLunch - startLunch)
,您可以按如下方式计算timeAtWork:
timeAtWork = (endWork - startWork) - lunchDuration
希望这有帮助!
答案 4 :(得分:0)
给定2个“HH:mm”字符串,以下方法将返回它们之间的浮点数:
function timeDiff(time1, time2) {
var time1array = time1.split(":");
var time2array = time2.split(":");
var hour1 = parseInt(time1array[0]);
var min1 = parseInt(time1array[1]);
var hour2 = parseInt(time2array[0]);
var min2 = parseInt(time2array[1]);
return (hour1 + min1/60) - (hour2 + min2/60);
}