首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行2天时PHP strtotime问题

执行2天时PHP strtotime问题
EN

Stack Overflow用户
提问于 2017-05-08 11:30:54
回答 3查看 119关注 0票数 0

我目前在strtotime()函数中遇到了一个问题。我正在为我的工作准备一个时间表,用户可以输入他们的工作时间,脚本从xml文件中获取所有变量并生成一个pdf.到目前为止,工作都很顺利,但是进入夜班有一个奇怪的问题。

因此,我设计了一个调试示例,用户在21:00 (晚上9点)开始工作,然后在06:00 (早上6点)完成工作。我想得到准确的输入工作时间,所以我每次strtotime()并比较它们。

我想问题是因为开始时间在第一天,完成时间在第二天,但是脚本认为它仍然在第一天.对不起,我没有找到任何解决办法,所以我希望这里的人能帮我。

示例代码:

代码语言:javascript
复制
<?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;

?>

编辑:找到了一个目前可行的解决办法,但也许有人有更好的解决方案。

代码:

代码语言:javascript
复制
<?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;

?>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-08 11:40:01

如果您使用的是动态日期和时间,那么在strtotime()中使用该日期和时间,或者您可以将虚拟日期用作:

代码语言:javascript
复制
$start = '2017-01-01 20:30';
$finish = '2017-01-02 06:30';
票数 1
EN

Stack Overflow用户

发布于 2017-05-08 11:45:29

尝试以下解决方案。

使用$start = date("d-m-Y H:i:s",time());

同时在XML文件中保存开始/完成/中断时间。

所以所有的条目都会包含日期。不会有任何冲突。

票数 0
EN

Stack Overflow用户

发布于 2017-05-08 11:50:47

在这里,当24Hours大于end-time时,我们要在相反的时间添加start-time。如果您没有约会,可以使用此解决方案。

Try this code snippet here

代码语言:javascript
复制
<?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;

?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43846550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档