【问题标题】:Create H:i value in Carbon from gmdate()从 gmdate() 在 Carbon 中创建 H:i 值
【发布时间】:2018-09-04 10:29:57
【问题描述】:

在 Laravel 应用中发现英国时钟的问题。在应用程序的任何地方,我们都使用 Carbon 并将 Europe/London 设置为时区,但找到一个使用 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 代替?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您将一个 unix 时间戳传递给 gmdate,并要求以 H:i 格式从该时间戳返回日期。 Unix 时间是...

    [...] 用于描述时间点的系统,定义为自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来经过的秒数减去闰秒数从那以后发生的秒数。

    所以46800 是 1970 年 1 月 1 日下午 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 年 3 月 26 日 13:00 和 2018 年 3 月 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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2012-09-07
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多