簡體   English   中英

在 PHP 中為 H:i 格式的時間添加 30 分鍾

[英]Adding 30 minutes to time formatted as H:i in PHP

此刻正在做噩夢,只是不明白為什么它不起作用

我有一個 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        
$time = strtotime('10:00');
$startTime = date("H:i", strtotime('-30 minutes', $time));
$endTime = date("H:i", strtotime('+30 minutes', $time));

為了使它起作用, $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');

我通常采取稍微不同的方式來實現這一點:

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

其中 1800 秒 = 30 分鍾。

$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);

您當前的解決方案不起作用,因為$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) );
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

只是為了擴展以前的答案,執行此操作的函數可以像這樣工作(根據function.date 的this 和 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;

您需要的是一個比給定日期時間晚 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 函數更不神秘。

如果您喜歡這種方法,可以了解更多關於本示例中使用蛋白酥皮庫以及整體方法的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM