46

此刻做噩梦,只是不明白为什么它不起作用

我有一个 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        
4

8 回答 8

109
$time = strtotime('10:00');
$startTime = date("H:i", strtotime('-30 minutes', $time));
$endTime = date("H:i", strtotime('+30 minutes', $time));
于 2010-05-04T16:32:34.600 回答
14

为了使它起作用$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');
于 2010-05-04T16:33:45.960 回答
6

我通常采取稍微不同的方式来实现这一点:

$startTime = date("H:i",time() - 1800);
$endTime = date("H:i",time() + 1800);

其中 1800 秒 = 30 分钟。

于 2010-05-04T16:36:13.967 回答
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) );
于 2010-05-04T16:37:01.440 回答
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);
于 2014-10-31T02:46:07.673 回答
0

您需要的是比给定日期时间晚 30 分钟的日期时间,以及比给定日期时间早 30 分钟的日期时间。换句话说,您需要一个未来的日期时间和一个过去的日期时间。因此,实现这一目标的类被称为Futureand 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 函数更不神秘。

如果您喜欢这种方法,您可以了解更多关于本示例中使用的蛋白酥皮库以及整体方法的信息。

于 2020-07-01T17:35:08.597 回答
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
于 2017-01-03T13:59:16.397 回答
0

只是为了扩展以前的答案,执行此操作的函数可以像这样工作(根据function.datethis 和 DateInterval的 this 更改时间和间隔格式,但是您喜欢它们):

// 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;
于 2017-04-04T19:24:35.197 回答