46

現時点で悪夢を見ていて、なぜそれが機能していないのかわからない

$ timeと呼ばれるH:i(つまり、10:00、13:30)などの形式の値があります

私がやりたいのは、$timeの30分前の$startTimeと$timeの30分後の$endTimeの2つの新しい値を作成することです。

私は次のことを試しましたが、うまくいきたくないようです

$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、タイムスタンプである必要があります。$time = date('H:i', '10:00');結果として0:30と1:30も得られるので、「10:00」などを渡すことはできません。

試す

$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
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.dateの場合はこれに従って、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;
于 2017-04-04T19:24:35.197 に答える
0

必要なのは、指定された日時より30分遅い日時と、指定された日時より30分前の日時です。つまり、将来の日時と過去の日時が必要です。したがって、それを達成するクラスはとと呼ばFuturePastます。彼らはあなたが必要とするものを計算するためにどのようなデータを必要としますか?どうやら、それらはそれらの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 に答える