PHP 执行 2 天时出现 strtotime 问题
PHP strtotime issue when executing 2 days
我目前在 strtotime()
功能中遇到问题。我正在为我的工作准备一个时间 table,用户可以在其中输入他们的工作时间,脚本从 xml 文件中获取所有变量并制作一个 pdf...到目前为止一切顺利,但有进入夜班时出现一个奇怪的问题。
所以我设计了一个调试示例,其中用户在 21:00(晚上 9 点)开始工作并在 06:00(早上 6 点)完成。
我想获得准确输入的工作时间,所以我每次都 strtotime()
并比较它们。
我想这个问题是因为开始时间在第 1 天,结束时间在第 2 天,但脚本认为它仍在第 1 天...抱歉,但我没有找到任何解决方案,所以我希望这里有人可以帮助我。
示例代码:
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = '20:30';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break_4_Start = '06:00';
$break_4_End = '06:15';
/**
* Minus when + 1 day
*/
$workTime = strtotime($finish) - strtotime($start);
$break1 = strtotime($break_1_End) - strtotime($break_1_Start);
$break2 = strtotime($break_2_End) - strtotime($break_2_Start);
$break3 = strtotime($break_3_End) - strtotime($break_3_Start);
$break4 = strtotime($break_4_End) - strtotime($break_4_Start);
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;
?>
编辑:
找到了目前有效的解决方法,但也许有人有更好的解决方案
代码:
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');
if($finish > $start) {
$workTime = $finish - $start;
} else {
$end1 = strtotime('24:00');
$start1 = strtotime('00:00');
$starty = $end1 - $start;
$endy = $finish - $start1;
$workTime = $starty + $endy;
}
$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;
?>
如果您使用动态日期和时间,则在 strtotime()
时使用该日期和时间
或者您可以将虚拟日期用作:
$start = '2017-01-01 20:30';
$finish = '2017-01-02 06:30';
尝试以下解决方案。
使用
$start = date("d-m-Y H:i:s",time());
在 XML 文件中保存 start/finish/break 计时。
因此所有条目也将包含日期。不会有任何冲突。
这里我们在相反的时间添加24Hours
,当start-time
大于end-time
时。如果您没有日期,可以使用此解决方案。
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = '23:00';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break_4_Start = '06:00';
$break_4_End = '06:15';
if(strtotime($finish)> strtotime($start))
{
$workTime = strtotime($start) - strtotime($finish);
}
else
{
$date=date_create_from_format("H:i", $finish);
$date->add(new DateInterval('PT24H'));//added 24 hours.
$workTime=strtotime($date->format("Y-m-d H:i:s"))- strtotime($start);
}
/**
* Minus when + 1 day
*/
$break1 = strtotime($break_1_End) - strtotime($break_1_Start);
$break2 = strtotime($break_2_End) - strtotime($break_2_Start);
$break3 = strtotime($break_3_End) - strtotime($break_3_Start);
$break4 = strtotime($break_4_End) - strtotime($break_4_Start);
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.(float)$workTime;
?>
我目前在 strtotime()
功能中遇到问题。我正在为我的工作准备一个时间 table,用户可以在其中输入他们的工作时间,脚本从 xml 文件中获取所有变量并制作一个 pdf...到目前为止一切顺利,但有进入夜班时出现一个奇怪的问题。
所以我设计了一个调试示例,其中用户在 21:00(晚上 9 点)开始工作并在 06:00(早上 6 点)完成。
我想获得准确输入的工作时间,所以我每次都 strtotime()
并比较它们。
我想这个问题是因为开始时间在第 1 天,结束时间在第 2 天,但脚本认为它仍在第 1 天...抱歉,但我没有找到任何解决方案,所以我希望这里有人可以帮助我。
示例代码:
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = '20:30';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break_4_Start = '06:00';
$break_4_End = '06:15';
/**
* Minus when + 1 day
*/
$workTime = strtotime($finish) - strtotime($start);
$break1 = strtotime($break_1_End) - strtotime($break_1_Start);
$break2 = strtotime($break_2_End) - strtotime($break_2_Start);
$break3 = strtotime($break_3_End) - strtotime($break_3_Start);
$break4 = strtotime($break_4_End) - strtotime($break_4_Start);
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;
?>
编辑: 找到了目前有效的解决方法,但也许有人有更好的解决方案
代码:
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = strtotime('20:30');
$finish = strtotime('06:30');
$break_1_Start = strtotime('20:45');
$break_1_End = strtotime('21:00');
$break_2_Start = strtotime('00:00');
$break_2_End = strtotime('00:30');
$break_3_Start = strtotime('03:00');
$break_3_End = strtotime('03:30');
$break_4_Start = strtotime('06:00');
$break_4_End = strtotime('06:15');
if($finish > $start) {
$workTime = $finish - $start;
} else {
$end1 = strtotime('24:00');
$start1 = strtotime('00:00');
$starty = $end1 - $start;
$endy = $finish - $start1;
$workTime = $starty + $endy;
}
$break1 = $break_1_End - $break_1_Start;
$break2 = $break_2_End - $break_2_Start;
$break3 = $break_3_End - $break_3_Start;
$break4 = $break_4_End - $break_4_Start;
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.$workTime;
?>
如果您使用动态日期和时间,则在 strtotime()
时使用该日期和时间
或者您可以将虚拟日期用作:
$start = '2017-01-01 20:30';
$finish = '2017-01-02 06:30';
尝试以下解决方案。
使用
$start = date("d-m-Y H:i:s",time());
在 XML 文件中保存 start/finish/break 计时。
因此所有条目也将包含日期。不会有任何冲突。
这里我们在相反的时间添加24Hours
,当start-time
大于end-time
时。如果您没有日期,可以使用此解决方案。
<?php
set_time_limit(0);
date_default_timezone_set('Europe/Berlin');
$start = '23:00';
$finish = '06:30';
$break_1_Start = '20:45';
$break_1_End = '21:00';
$break_2_Start = '00:00';
$break_2_End = '00:30';
$break_3_Start = '03:00';
$break_3_End = '03:30';
$break_4_Start = '06:00';
$break_4_End = '06:15';
if(strtotime($finish)> strtotime($start))
{
$workTime = strtotime($start) - strtotime($finish);
}
else
{
$date=date_create_from_format("H:i", $finish);
$date->add(new DateInterval('PT24H'));//added 24 hours.
$workTime=strtotime($date->format("Y-m-d H:i:s"))- strtotime($start);
}
/**
* Minus when + 1 day
*/
$break1 = strtotime($break_1_End) - strtotime($break_1_Start);
$break2 = strtotime($break_2_End) - strtotime($break_2_Start);
$break3 = strtotime($break_3_End) - strtotime($break_3_Start);
$break4 = strtotime($break_4_End) - strtotime($break_4_Start);
$workTime = $workTime - $break1 - $break2 - $break3 - $break4;
$workTime = $workTime / 60;
$workTime = $workTime / 60;
echo 'Work Time: '.(float)$workTime;
?>