在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而不是?
谢谢!
答案 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:00
和1970-01-01 01:00:00
之间每分钟的时间戳。然后,您的代码将遍历每个时间戳,并将时间戳添加到格式$times
的{{1}}数组中 - YmdHi
格式,我写这篇评论的时间是YmdHi
。
Carbon具有增加时间的本地方法(201803261300
,addSeconds
,addMinutes
等),因此您可以使用这些方法代替完成修改和生成时间的所有工作。
您还没有包含如何使用代码的示例,因此我将在以下示例中猜测:
我希望在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