我正在制作一个进出时间系统,只是编辑一些代码。记录时间的格式为H:i:s。该系统允许用户在桌子中查看他们在办公室的时间。在表格中,第一行:我们有Date-In,Time-In,Date-Out,Time-Out和员工留在办公室的小时数。例如,时间是从09:00:00到18:00:00,显示的小时是9.00小时,因为我是以十进制格式制作的。如果它的09:20:00到18:00:00它的小时数也应该是十进制的。例如:8.70小时。这样的事情。
现在,正在显示的表是整个月。在表格下方,总小时数的格式为小时和分钟(例如,77小时和6分钟)以及小数(77.10小时)。 如何计算总小时数?
下面的代码是小时的计算。获取时间和时间。
$n = $totalMins/60;
$whole = floor($n); // 1
$fraction = $n - $whole;
$totalHrs += $whole;
$totalMins = round($fraction*60);
$totalMins = sprintf("%02d", $totalMins);
$elapsedDeci = round($fraction, 2);
$elapsedDeci += $totalHrs;
$elapsedDeci = number_format($elapsedDeci, 2);
$elapsed = "$elapsedDeci";
答案 0 :(得分:0)
您的方法的主要问题是,您混合了计算和时间格式,这使您难以使用结果进行计算。
我建议你严格分开计算和展示。这样,您可以先计算时间,然后以格式化方式显示它们。
通过阅读你的代码,我假设你已经拥有了每天的工作时间,例如在这样的数组中(为了解释和可读性,让我们假装我们的月份是只有七天):
$minutes_stayed = array(480, 500, 460, 503, 429, 0, 0);
使用任何类型的数据库查询创建一些类似的结构应该很容易。
现在,您应该首先尝试将分钟格式化为您想要使用的时间跨度,例如小时或小数小时。存储单个时间跨度,如$minutes = 480;
,并执行一些数学魔法。请注意,我还没有进行任何字符串格式化:
$formatted = array();
$formatted["hours"] = floor($minutes/60);
$formatted["minutes"] = $minutes - $formatted["hours"]*60;
$formatted["decimal"] = $formatted["hours"] + $formatted["minutes"]/60;
在你这样做之后,你可以自由地做任何你想做的事。总和/减去/打印/扔掉/ ......可能性是无穷无尽的。
看看下面的课程。它基本上是对现有代码的推导,但是严格分离计算和置换:
class TimeCalculator
{
public static function print_as_decimal( $decimal )
{
echo number_format($decimal, 2, '.', '')." hours";
}
public static function print_as_h_and_min( $hours, $minutes )
{
echo $hours." hours and ".$minutes." minutes";
}
public static function format( $minutes )
{
$formatted = array();
$formatted["hours"] = floor($minutes/60);
$formatted["minutes"] = $minutes - $formatted["hours"]*60;
$formatted["decimal"] = $formatted["hours"] + $formatted["minutes"]/60;
return $formatted;
}
}
要弄清楚每项功能的作用应该不难。使用本课程,您可以轻松完成所需的一切。试试这段代码:
$minutes_stayed = array(480, 500, 460, 503, 429, 0, 0);
foreach($minutes_stayed as $day => $time)
{
$formatted = TimeCalculator::format($time);
echo TimeCalculator::print_as_decimal($formatted["decimal"])." equals ";
echo TimeCalculator::print_as_h_and_min($formatted["hours"], $formatted["minutes"])."<br />";
}
$formatted_total = TimeCalculator::format(array_sum($minutes_stayed));
echo "Total: ";
echo TimeCalculator::print_as_decimal($formatted_total["decimal"])." or ";
echo TimeCalculator::print_as_h_and_min($formatted_total["hours"], $formatted_total["minutes"])."<br />";
正如您所看到的,通过计算器和displayal的正确分离,您实际需要计算总小时数的唯一方法是array_sum($minutes_stayed)
。