使用php减去并添加一个给定时间的时间变量

时间:2017-10-02 13:23:35

标签: php

我有一个给定的时间,我需要在另一个给定时间创建另一个时间基础。假设我已经给了凌晨4:00:00,而另一个时间是2:00:00,我的结果应该是早上6:00:00和凌晨2:00:00(基于条件)。 这就是我正在使用但它没有给出更正结果。

 if($data['turn_on_before_or_after'] == 'before'){
     $time = strtotime($data['sunset']) - strtotime($data['variation_turn_on']);
     $dataNew['final_turn_on'] = date('h:m:s',$time);
 }
 if($data['turn_on_before_or_after'] == 'after'){
     $time = strtotime($data['sunset']) + strtotime($data['variation_turn_on']);
     $dataNew['final_turn_on'] = date('h:m:s',$time);
 }

2 个答案:

答案 0 :(得分:0)

建议:使用strtotime()。它将采用日期/时间/日期时间字符串并将其转换为整数;从unix时代开始。因此2AM将是7200,而4AM将是14400;将这些整数添加到一起并使用date('H', $result)将整数转换回时间字符串。 Boosh,赢了!

意见:很多人会说unix时间戳难以使用,因为它不是人类可读的;我宁愿我的逻辑比输出容易阅读。因为输出仅在处理结束时发生。

答案 1 :(得分:0)

我重新创建了您的方案,但我没有使用strtotime,而是使用了DateTime对象。

您的主要问题是您的第一个日期($data['sunset'])必须被视为实际日期,但您的第二个日期($data['variation_turn_on'])必须被视为间隔。因此,在查看DateInterval对象构造函数之后,您会注意到可以使用初始字符串中的sscanf创建间隔。创建该间隔后,您所要做的就是使用DateTime类中的方法简单地添加或减去特定日期的间隔。

以下是我为获得您期望的结果而编写的代码(上午6:00:00和凌晨2:00:00):

<?php
    /* Initial parameters */
    $data['turn_on_before_or_after'] = "before";
    $data['sunset'] = "4:00:00 AM";
    $data['variation_turn_on'] = "2:00:00";

    /* Creating a list with your variation values */
    list($hours, $minutes, $seconds) = sscanf($data['variation_turn_on'], '%d:%d:%d');

    /* Creating the interval (here is the magic) */
    $intervale = new DateInterval(sprintf('PT%dH%dM%dS', $hours, $minutes, $seconds));

    /* Creating a DateTime object from your sunset time */
    $date = new DateTime($data['sunset']);

    /* Ternary for simplification, substract if before, add if everything else, you may use an if statement here */
    $data['turn_on_before_or_after'] == 'before' ? $date->sub($intervale) : $date->add($intervale);

    /* Printing the result */
    echo $date->format('h:i:s A');