Php 如何在没有致命错误的情况下将大时间从H:i:s转换为H:i?

Php 如何在没有致命错误的情况下将大时间从H:i:s转换为H:i?,php,datetime,Php,Datetime,我有一个mysql列workTime2,其值为838:59:59。我从数据库中获取值并与以下代码一起使用: $work2MinutesStr = $employeeWork->workTime2; if (strlen($work2MinutesStr) == 0) { $work2MinutesStr = '00:00:00'; } $work2Minutes = DateTime::createFromFormat('H:i:s', $work2MinutesStr); $

我有一个mysql列
workTime2
,其值为
838:59:59
。我从数据库中获取值并与以下代码一起使用:

$work2MinutesStr = $employeeWork->workTime2;

if (strlen($work2MinutesStr) == 0) {
    $work2MinutesStr = '00:00:00';
}

$work2Minutes = DateTime::createFromFormat('H:i:s', $work2MinutesStr);
$work2MinutesStr = $work2Minutes->format('H:i');
但代码在最后一行失败,出现错误:
致命错误:对非对象调用成员函数format()

DateTime类型工作正常,但无法处理此类值。
是否有解决此问题的方法?

将您的小时数转换为天,然后删除白天的小时数

$timeParts = explode(':', $work2MinutesStr);
$hours = $timeParts[0];

$days = floor($hours / 24);
$daysHours = $days * 24;

$timeParts[0] = $timeParts[0] - $daysHours;

echo $timeParts[0] . ':' . $timeParts[1];

我认为问题在于,有时候你总共有838个小时,超出了mysql的时间范围。在php中没有处理三位数小时的格式,因此会出现错误

1) 我认为您需要在sql查询中将时间转换为秒,并使用秒

2) 然后你可以将秒除以3600,得到总小时数

更新

默认情况下,位于时间范围之外但在其他方面有效的值将剪裁到该范围的最近端点。例如,“-850:00:00”和“850:00:00”被转换为“-838:59:59”和“838:59:59”

因此,当你得到
838:59:59
hours时,就意味着你得到了不正确的小时数。可能您有900多个小时,但由于MySQL中时间值的限制,您只能得到
839
。但假设这个数字(
839
)是正确的。当您在php中读取此值并尝试使用
h:i:s
格式在php中使用DateTime类时,由于时间格式不正确,DateTime类无法正确处理此字符串(
838:59:59
)。格式不正确,因为它有三个小时数字。因此,当您尝试调用此方法时,
$work2Minutes->format('H:i')
它会说,
调用非对象上的成员函数format()
,因为DateTime无法将字符串转换为对象


这就是使用秒或其他时间类型的方法,以便获得正确的时间并正确处理它。

尝试以下方法:
echo date('H:i',strotime($work2MinutesStr))在if声明之后为什么有838小时?@JoachimMartinsen,特定员工在特定机型上的飞行时间。在数小时内需要它。那么,如果它以
838:59:59
开头,那么你期望它最终会是什么呢?@JoachimMartinsen,如果你能想到这一点,为什么机器不能呢?我说这段代码99%的时间都有效,除了这种情况。例如,为什么我不能使用2000小时?mysql方面没有问题,这个值的
H:I:s
格式的DateTime也没有问题。我不需要几秒钟,因为我已经有几个小时了。那么..什么解决方案可以在这里提供帮助(838小时以上)?考虑到此格式中已经记录了数千行,您需要尝试在sql查询中使用time_to_sec()函数将时间转换为秒。然后在php中,手动将秒除以60*60,得到总小时数。如果你想在一个小时内拥有3位数的数据,你需要手动格式化它。我要存储数据库(将数据放在838小时内)。。。输入分钟数?对不起,我不太明白你的意思。您能从存储时间的数据库中发布一些示例数据吗?