2017-08-24 58 views
0

我见过各种帖子,询问如何从DateTime中减去特定的小时数,天数等 - 但我的问题有点不同。如何通过改变时间来减去日期时间

说我有一个用户登录,系统记录日期/时间。每秒钟,计时器会根据当前日期/时间和记录的日期/时间之间的差异增加 - 有效地创建登录计时器。然后,用户决定暂停定时器,因此系统记录暂停开始和暂停结束(当它们恢复时)。我想要做的是使显示的时间减去暂停时间 - 这样暂停时计时器不会“增加”。因为我没有使用实际的计数器,所以每秒钟都不会计算在这种情况下,我不知道如何计算计时器的适当值。

这里是上显示所述定时器(incriment.php的一部分)的代码:

date_default_timezone_set('America/Chicago'); 
$date = new DateTime(date('m/d/Y H:i')); 
$date2 = new DateTime(date($_SESSION['date_in'] . ' ' . 
$_SESSION['time_in'])); 
$interval = $date->diff($date2); 
$interval = $interval->format('%H:%I'); 
$_SESSION['current_timer'] = $interval; 
echo $_SESSION['current_timer']; 

这里是上被暂停

if(isset($_SESSION['paused']) && $_SESSION['paused'] === true) { 
    echo '<div class="info">'; 
    echo '<img src="images/information-button" style="max-width:3em">'; 
    if(isset($_SESSION['pause_start'])) {   
     date_default_timezone_set('America/Chicago'); 
     if(isset($_SESSION['pause_end'])) { 
      $time = $_SESSION['pause_end']->diff($_SESSION['pause_start']); 
      echo '<br>Current pause time: ' . $time->format('%H:%I'); 
     } else { 
      $time = new DateTime(date('H:i')); 
      $time = $time->diff(new DateTime($_SESSION['date_pause_start'] . ' ' . $_SESSION['pause_start'])); 
      $_SESSION['pause_timer'] = $time->format('%h hours, %i minutes'); 
      echo '<br>Pause timer: ' . $time->format('%h hours, %i minutes'); 
     } 
     echo '</div>'; 
    } 
} 

TLDR代码;当我不知道该差异是否会返回分钟数(例如30分钟)或小时数(例如1小时30分钟)时,如何通过由diff返回的对象来减去日期时间。我不能做this作为不知道的结果,我也不能做像$date->modify("+30 minutes")这样的事情,因为我不知道它是几分钟还是几小时或什么。我觉得应该很容易,因为在我的午餐计算中,$time显示暂停的时间(例如:30分钟),并将其用于字符串,我可以使用$date->modify策略 - 但这不起作用(请参阅下面的内容)我incriment.php我之前展示)

$interval = $interval->format('H:i'); 
if(isset($_SESSION['pause_timer'])) { 
    $interval = new DateTime(date($interval)); 
    $interval = $interval->modify("-". $_SESSION['pause_timer']); 
    echo '-' . $_SESSION['pause_timer']; 
} 

但是,回声的出-0小时40分钟,如果用户被暂停40分钟 - 和改变从01:48时至14:18这是非常令人困惑因为它显然应该是1:08。这对我意味着我不适当地使用DateTime来处理我的情况,有没有更好的解决方案

谢谢!

编辑:用户只能在每个会话暂停一次纯朴的缘故

+0

我认为getTimestamp是你的朋友在这里:http://php.net/manual/en/datetime.gettimestamp.php。一旦一个时间戳,你可以做简单的减法或添加秒,然后根据需要进行格式化。 –

+0

时间戳也可以做到。如果我的时间是08:20而我的午餐时间是00:30 - 我在00:30之前减去08:20,那么是7:50还是会认为00:30是上午12:30的军事时间?因此它会在上午12点30分减去上午8点20分?如果这不起作用,如果我将它格式化为0小时30分钟,它会起作用吗? – YaBoi

回答

0

我欣赏的意见的答复[甚至那些它们删除;),我设法得到它的工作通过在$_SESSION['pause_timer'] = $time->format('%h hours, %i minutes')改变暂停码到$_SESSION['pause_timer'] = $time->format('-%h hours, -%i minutes')。我的问题是我只减去了几个小时,所以当我的时间只有几分钟时间,它就增加了分钟数并减去了0小时!

+0

如果你担心PHP会知道什么时候是什么,那么使用createFromFormat:http://php.net/manual/en/datetime.createfromformat.php –