从gmdate()创建H:i值

时间:2018-03-26 10:01:18

标签: php laravel laravel-5 timezone php-carbon

在Laravel应用程序中发现了一个问题,其中包括英国时钟。应用程序中的任何地方我们都使用Carbon并将欧洲/伦敦设置为时区,但找到了一个使用gmdate()的位置。

该方法遍历一个范围,并以小时:分钟格式创建一系列可用时隙:

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而不是?

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在将一个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的{​​{1}}数组中 - YmdHi格式,我写这篇评论的时间是YmdHi

Carbon具有增加时间的本地方法(201803261300addSecondsaddMinutes等),因此您可以使用这些方法代替完成修改和生成时间的所有工作。

您还没有包含如何使用代码的示例,因此我将在以下示例中猜测:

  

我希望在2018-03-26 13:00和2018-03-26 14:00之间每隔5分钟

传递Carbon的实例,每个插槽的分钟数和插槽数:

addHours

另一种实现方式是传递开始时间和结束时间,例如:

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

我的偏好是返回一个Carbon实例数组(而不是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); 格式的日期字符串数组),但也许你需要系统中其他地方的YmdHi格式时间戳。

虽然我看不到你的其余代码,但我猜你也可能只是做这样的事情 - 我上面的回答可以更好地了解你如何解决问题:

YmdHi