起初,您的时间写错了。毫秒前应该有小数点。
这意味着会有时间
10:15:30.300 和 11:15:35.450
改为
10:15:30:300 和 11:15:35:450
但是在下面编写的课程中,您可以改进模式以适应您的时间格式。或更改整体检查。
对于类似的情况,我最近必须解决(读取智能手机/平板电脑 app IoTools 创建的 csv 文件并计算时间之间的毫秒差异),并根据问题 How to get time difference in milliseconds,我准备了课程这样做 - 但仅限于一天(24 小时)的范围内。
它并不完美(因为它可以提供更多选项)但它计算得很好(我希望它做得很好,我没有对其进行太多测试)。
对于这个答案,我删除了抛出异常的细节,并用它们的值重写了一些常量。我还删除了注释以使代码更短,但用描述性文本替换它们。
class DayTimeCount
{
时间转换为毫秒。因此,这两个变量可以键入为integer。
protected $Time_Start = 0;
protected $Time_End = 0;
时间刻度也可以是整数。这个变量的名称可能有点不幸,因为它没有完全正确地说明它的用途。
protected $Time_Scale = 1;
这个变量可以是一个常数。它的内容根本没有改变。
private $TimePattern = '/(?<Hours>[0-9]{2})\:(?<Minutes>[0-9]{2})\:(?<Seconds>[0-9]{2}).(?<Milliseconds>[0-9]{0,3})/';
此功能用于设置开始时间(需要计算开始时间间隔的时间)。检查时间是否设置为正确的模式后(如上面写的字符串对应模式,不是整数),时间转换为毫秒。
public function Set_StartTime($Time = NULL)
{
try
{
if( !preg_match($this -> TimePattern, $Time, $TimeUnits) )
{
throw new Exception(/* some code */);
}
}
catch( Exception $Exception )
{
$Exception -> ExceptionWarning(/* some code */);
}
$this -> Time_Start = ($TimeUnits['Hours'] * 60 * 60 * 1000) + ($TimeUnits['Minutes'] * 60 * 1000) + ($TimeUnits['Seconds'] * 1000) + $TimeUnits['Milliseconds'];
}
此功能与之前类似,但用于设置结束时间(结束间隔的时间需要计算)。
public function Set_EndTime($Time = NULL)
{
try
{
if( !preg_match($this -> TimePattern, $Time) )
{
throw new Exception(/* some code */);
}
}
catch( Exception $Exception )
{
$Exception -> ExceptionWarning(/* some code */);
}
$this -> Time_End = ($TimeUnits['Hours'] * 60 * 60 * 1000) + ($TimeUnits['Minutes'] * 60 * 1000) + ($TimeUnits['Seconds'] * 1000) + $TimeUnits['Milliseconds'];
}
此功能用于设置时间刻度。它有助于将毫秒转换为秒(精确到毫秒)或分钟或小时。
静态函数Check_IsTimeScale 是我自己的函数,作为in_array() 工作。
public function Set_TimeScale($Scale = 1)
{
try
{
if( !Core::Check_IsTimeScale($Scale) )
{
throw new Exception(/* some code */);
}
}
catch( Exception $Exception )
{
$Exception -> ExceptionWarning(/* some code */);
}
$this -> Time_Scale = $Scale;
}
最后,功能是自己计算时差。它只有三个步骤。
public function Execute()
{
第一个是自己的计数。如果 end 和 start 之间的差为正数(大于零),则按原样处理。
但是如果 end 和 start 之间的差异是负数(因为 end 在午夜之后,而 start 在午夜之前,例如 00:00:00.658 和 23:59:59:354),则需要使用额外的计数。区分一天的开始时间和全天时间 - 并添加结束时间。
$Diff = $this -> Time_End - $this -> Time_Start;
if( $Diff < 0 )
{
$Diff = $this -> Time_End + (86400000 - $this -> Time_Start);
}
第二步,时间尺度的应用。以毫秒为单位的时间除以时间刻度。如果除以 1,结果(当然)与原始数字相同,并且不四舍五入。如果它被更大的数字(允许的选项中的 1000 或更大)除以,则四舍五入到用于除它的数字的长度。
$Diff = round($Diff / $this -> Time_Scale, strlen($this -> Time_Scale));
第三步是返回最终结果。可能它可以与上一步合并,但现在它(至少)可读性更好。
return $Diff;
}
}
函数ExceptionWarning也是我的函数,可以换成你自己的。