【发布时间】:2011-03-12 20:10:51
【问题描述】:
我有两个值用于表示完成任务所需的时间。如何将这些值加在一起得出总小时数和分钟数,但仍然有 60 分钟等于一小时的值帐户?
我想得到总和的两个值和总值的格式是 HH:MM (00:00)。
谢谢!
【问题讨论】:
标签: javascript jquery time
我有两个值用于表示完成任务所需的时间。如何将这些值加在一起得出总小时数和分钟数,但仍然有 60 分钟等于一小时的值帐户?
我想得到总和的两个值和总值的格式是 HH:MM (00:00)。
谢谢!
【问题讨论】:
标签: javascript jquery time
编写您自己的时间和日期函数可能会变得复杂。为什么要重新发明轮子。看看优秀的http://www.datejs.com/ 日期库。它处理所有与日期和时间相关的任务,使用非常简单。
【讨论】:
这是我放的东西。它允许无限数量的参数,因此您可以使用addTime('01:00') 或addTime('01:00', '02:00', '03:00', '04:00') 等。它有三个函数,因为它还验证输入的时间是否正确格式化,如果没有,则格式化它们。 (例如,确保分钟是 2 位长,如果小时是 1 位长,则用一个零填充,等等)
你可以在这里玩:http://jsfiddle.net/WyxwU/
它也在这里:
var totalTime = addTime('12:34', '56:12', '78:45');
document.write(totalTime);
function addTime()
{
if (arguments.length < 2)
{
if (arguments.length == 1 && isFormattedDate(arguments[0])) return arguments[0];
else return false;
}
var time1Split, time2Split, totalHours, totalMinutes;
if (isFormattedDate(arguments[0])) var totalTime = arguments[0];
else return false;
for (var i = 1; i < arguments.length; i++)
{
// Add them up
time1Split = totalTime.split(':');
time2Split = arguments[i].split(':');
totalHours = parseInt(time1Split[0]) + parseInt(time2Split[0]);
totalMinutes = parseInt(time1Split[1]) + parseInt(time2Split[1]);
// If total minutes is more than 59, then convert to hours and minutes
if (totalMinutes > 59)
{
totalHours += Math.floor(totalMinutes / 60);
totalMinutes = totalMinutes % 60;
}
totalTime = totalHours + ':' + padWithZeros(totalMinutes);
}
return totalTime;
}
function isFormattedDate(date)
{
var splitDate = date.split(':');
if (splitDate.length == 2 && (parseInt(splitDate[0]) + '').length <= 2 && (parseInt(splitDate[1]) + '').length <= 2) return true;
else return false;
}
function padWithZeros(number)
{
var lengthOfNumber = (parseInt(number) + '').length;
if (lengthOfNumber == 2) return number;
else if (lengthOfNumber == 1) return '0' + number;
else if (lengthOfNumber == 0) return '00';
else return false;
}
【讨论】:
这里是简单的 JS 代码,
var a = "2:50";
var b = "2:15";
var splitTimeStr = function(t){
var t = t.split(":");
t[0] = Number(t[0]);
t[1] = Number(t[1]);
return t;
};
var addTime = function(t1, t2){
var t1Hr = splitTimeStr(t1)[0];
var t1Min = splitTimeStr(t1)[1];
var t2Hr = splitTimeStr(t2)[0];
var t2Min = splitTimeStr(t2)[1];
var rHr = t1Hr + t2Hr;
var rMin = t1Min + t2Min;
if (rMin >= 60)
{
rMin = rMin - 60;
rHr = rHr + 1;
}
if (rMin < 10) rMin = "0" + rMin;
if (rHr < 10) rHr = "0" + rHr;
return "" + rHr + ":" + rMin;
};
document.write(addTime(a, b));
您可以在此处使用代码验证/播放此内容:http://jsfiddle.net/z24v7/
【讨论】:
:)
你要做的就是将它们计算到小数点。 将小时/分钟数减去 60 + 到分钟数
//去掉时间 l_hour = Number(l_time$.substr(0, l_pos)); //去掉分钟 l_min = Number(l_time$.substr(l_pos + 1, l_time$.length)); //将两个值相加除以 60 分钟 l_time_decimal= Number(Math.abs(l_hour)) + Number(Math.abs(l_min)/60);
对每个值执行此操作,然后减去两个数字以得出差异(即所用时间)。剩下的就是将它从小数转换回时间 l_difference_in_min = l_difference * 60; l_time_mins = l_difference_in_min%60; l_time_hours = (l_difference_in_min - l_mins)/60;
现在只需将两者格式化为 HH:MM
【讨论】:
我会将问题分解为可重用的子任务。您必须在这里担心:
您将两次相加的事实是对上述两个实际问题的转移。
将时间字符串解析为分钟:
function parseMinutes(s) {
var tokens = s.split(":");
return tokens[0] * 60 + parseInt(tokens[1]);
}
将分钟格式化为时间字符串:
function formatMinutes(minutes) {
function pad(n) {
return n > 9
? n
: ("0" + n);
}
var hours = Math.floor(minutes / 60),
mins = minutes % 60;
return pad(hours) + ":" + pad(mins);
}
那么您的具体问题可以通过以下方式解决:
var sum = formatMinutes(parseMinutes(a) + parseMinutes(b));
【讨论】: