我有一个给定的时间,我需要在另一个给定时间创建另一个时间基础。假设我已经给了凌晨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);
}
答案 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');