此刻有一场噩梦,却无法理解为什么它不起作用
我有一个H:i(即10:00,13:30)等形式的值,称为$ time
我想要做的是创建两个新值,$ startTime在$ time之前30分钟,$ endTime在$ time之后30分钟
我尝试了以下但似乎并不想工作
$startTime = date("H:i",strtotime('-30 minutes',$time));
$endTime = date("H:i",strtotime('+30 minutes',$time));
如果我通过10:00作为$ time并且同时回显$ startTime和$ endTime,我得到:
$startTime = 00:30
$startTime = 01:30
答案 0 :(得分:83)
$time = strtotime('10:00');
$startTime = date("H:i", strtotime('-30 minutes', $time));
$endTime = date("H:i", strtotime('+30 minutes', $time));
答案 1 :(得分:9)
为了使其工作$time
必须是时间戳。你不能传递“10:00”或类似$time = date('H:i', '10:00');
这样的东西,因为那样我也会得到0:30和1:30的结果。
尝试
$time = strtotime('10:00');
作为替代方案,请考虑使用DateTime(以下需要PHP 5.3但):
$dt = DateTime::createFromFormat('H:i', '10:00'); // create today 10 o'clock
$dt->sub(new DateInterval('PT30M')); // substract 30 minutes
echo $dt->format('H:i'); // echo modified time
$dt->add(new DateInterval('PT1H')); // add 1 hour
echo $dt->format('H:i'); // echo modified time
或程序如果你不喜欢OOP
$dateTime = date_create_from_format('H:i', '10:00');
date_sub($dateTime, date_interval_create_from_date_string('30 minutes'));
echo date_format($dateTime, 'H:i');
date_add($dateTime, date_interval_create_from_date_string('1 hour'));
echo date_format($dateTime, 'H:i');
答案 2 :(得分:4)
我通常采取略微不同的方式:
$startTime = date("H:i",time() - 1800);
$endTime = date("H:i",time() + 1800);
1800秒= 30分钟。
答案 3 :(得分:1)
您当前的解决方案不起作用,因为$time
是一个字符串 - 它需要是一个Unix时间戳。你可以这样做:
$unix_time = strtotime('January 1 2010 '.$time); // create a unix timestamp
$startTime date( "H:i", strtotime('-30 minutes', $unix_time) );
$endTime date( "H:i", strtotime('+30 minutes', $unix_time) );
答案 4 :(得分:1)
$time = 30 * 60; //30 minutes
$start_time = date('Y-m-d h:i:s', time() - $time);
$end_time = date('Y-m-d h:i:s', time() + $time);
答案 5 :(得分:0)
echo date( "Y-m-d H:i:s", strtotime("2016-10-10 15:00:00")+(60*30) );//2016-10-10 15:30:00
或
echo date( "H:i:s", strtotime("15:00:00")+(60*30) ); // 15:30:00
或
echo date( "H:i:s", strtotime(date("H:i:s"))+(60*30) ); // 15:30:00
答案 6 :(得分:0)
为了扩展以前的答案,执行此操作的功能可以这样工作(根据this for function.date和this for DateInterval更改时间和间隔格式,但是你需要它们):
// Return adjusted start and end times as an array.
function expandTimeByMinutes( $time, $beforeMinutes, $afterMinutes ) {
$time = DateTime::createFromFormat( 'H:i', $time );
$time->sub( new DateInterval( 'PT' . ( (integer) $beforeMinutes ) . 'M' ) );
$startTime = $time->format( 'H:i' );
$time->add( new DateInterval( 'PT' . ( (integer) $beforeMinutes + (integer) $afterMinutes ) . 'M' ) );
$endTime = $time->format( 'H:i' );
return [
'startTime' => $startTime,
'endTime' => $endTime,
];
}
$adjustedStartEndTime = expandTimeByMinutes( '10:00', 30, 30 );
echo '<h1>Adjusted Start Time: ' . $adjustedStartEndTime['startTime'] . '</h1>' . PHP_EOL . PHP_EOL;
echo '<h1>Adjusted End Time: ' . $adjustedStartEndTime['endTime'] . '</h1>' . PHP_EOL . PHP_EOL;
答案 7 :(得分:0)
您需要的是比给定日期时间晚30分钟的日期时间,以及比给定日期时间晚30分钟的日期时间。换句话说,您需要将来的日期时间和过去的日期时间。因此,实现该目标的类称为Future
和Past
。他们需要什么数据来计算您的需求?显然,他们必须有一个相对于该30分钟的日期时间,以及一个间隔本身-在您的情况下为30分钟。因此,所需的日期时间如下所示:
use Meringue\ISO8601DateTime\FromCustomFormat as DateTimeCreatedFromCustomFormat;
(new Future(
new DateTimeCreatedFromCustomFormat('H:i', '10:00'),
new NMinutes(30)
))
->value();
如果要以某种方式格式化它,可以执行以下操作:
use Meringue\ISO8601DateTime\FromCustomFormat as DateTimeCreatedFromCustomFormat;
(new ISO8601Formatted(
new Future(
new DateTimeCreatedFromCustomFormat('H:i', '10:00'),
new NMinutes(30)
),
'H:i'
))
->value();
它更冗长,但我想它比内置的php函数要少一些神秘性。
如果您喜欢这种方法,则可以在此示例中进一步了解meringue library used和the overall approach。