[英]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 分鍾的日期時間。 換句話說,您需要一個未來的日期時間和一個過去的日期時間。 因此,實現這一目標的類稱為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 函數更不神秘。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.