簡體   English   中英

從gmdate()在Carbon中創建H:i值

[英]Create H:i value in Carbon from gmdate()

在Laravel應用中發現了一個問題,該問題與英國的時鍾有關。 在應用程序中的每個地方,我們都使用Carbon,並將歐洲/倫敦設置為時區,但是找到了一個使用gmdate()的位置。

該方法循環遍歷一個范圍,並以Hours:Minutes格式創建一個可用時隙數組:

foreach ( range( $lower, $upper, $step ) as $increment ) {
    $increment = gmdate( 'H:i', $increment );
    list( $hour, $minutes ) = explode( ':', $increment );
    $times[] = Carbon::createFromFormat('YmdHi', $day->format('Y') . $day->format('m') . $day->format('d') . $hour . $minutes);
}

我不太清楚gmdate是如何根據以下方面的增量來創建該值的:

46800  
48600  
50400  
52200  
54000  
55800  
59400 

是否可以執行與gmdate()方法相同的操作,但是用Carbon代替?

謝謝!

您要將unix時間戳傳遞給gmdate並要求以H:i格式從該時間戳返回日期。 Unix時間是...

用於描述時間點的系統,定義為自1970年1月1日(星期四)00:00:00協調世界時(UTC)以來經過的秒數,減去從那時起發生。

所以46800是在1970-01-01這在下午1點H:i的格式是13:00

您當前的代碼正在生成$lower時間戳和$upper時間戳之間的時間戳范圍,以$step遞增,例如:

$lower = 0; // The epoch, 1970-01-01 00:00:00
$upper = 3600; // An hour of seconds later, 1970-01-01 01:00:00
$step = 60; // Increment by one minute (60 seconds)

$timestamps = range($lower, $upper, $step);

$timestamps現在是一個數組,其中包含1970-01-01 00:00:001970-01-01 01:00:00之間每分鍾的時間戳。 然后,您的代碼將遍歷這些時間戳中的每一個,並將時間戳添加到$times數組中,格式為YmdHi -我編寫此評論時的YmdHi格式為201803261300

Carbon具有用於增加時間的本機方法( addSecondsaddMinutesaddHours等),因此您無需執行所有修改或生成時間的工作,而可以使用這些方法。

您尚未提供有關如何使用代碼的示例,因此我將在以下位置猜測該示例:

我想要在2018-03-26 13:00和2018-03-26 14:00之間每5分鍾

輸入Carbon實例,每個插槽的分鍾數和插槽數:

function generateTimeSlots(Carbon $time, integer $minutesPerSlot, integer $numberOfSlots) {
    $slots = range(0, $numberOfSlots);

    foreach ($slots as $k => $slot) {
        $slots[$k] = $time->addMinutes($minutesPerSlot)->format('YmdHi');
    }

    return $slots;
}


$slots = generateTimeSlots(Carbon::now(), 5, 12);

另一種實現方式是傳入開始時間和結束時間,例如:

function generateTimeslots(Carbon $start, Carbon $finish, integer $minutesPerSlot) {
    $slots = [];

    while ($start <= $finish) {
        $slots[] = $start->addMinutes($minutesPerSlot)->format('YmdHi');
    }

    return $slots;
}


$slots = generateTimeslots(Carbon::now(), Carbon::now()->addHour(), 5);

我的偏好是返回一個Carbon實例數組(而不是YmdHi格式日期字符串的數組),但也許您需要系統其他位置的YmdHi格式時間戳。


盡管我看不到其余的代碼,但我也在猜測您可能可以做類似的事情-上面的答案為您如何解決問題提供了更好的思路:

// $day appears to be a Carbon date instance defined elsewhere that represents the first time on the day on which the slots are to be generated

foreach ( range( $lower, $upper, $step ) as $increment ) {
    $times[] = $day->addSeconds($step)->format('YmdHi');
}

暫無
暫無

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

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