Недопустимая комбинация год / неделя в PHP в первые дни года
Почему это происходит (может быть причиной Carbon
продолжается DateTime
и это http://php.net/manual/es/datetime.format.php) и как получить правильную неделю от Carbon
экземпляр при смене часового пояса?
use Carbon\Carbon;
$wet = Carbon::parse( '2017-01-02 00:47:21', 'WET' );
$cet = Carbon::parse( '2017-01-02 00:47:21', 'CET' );
$new = $cet->copy()->tz( 'WET' );
print_r( [
'cet->format(ATOM)' => $cet->format( Carbon::ATOM ), //prints: 2017-01-02T00:47:21+01:00
'cet->format(Y W)' => $cet->format( 'Y W' ), //prints: 2017 01
'wet->format(ATOM)' => $wet->format( Carbon::ATOM ), //prints: 2017-01-02T00:47:21+00:00
'wet->format(Y W)' => $wet->format( 'Y W' ), //prints: 2017 01
'new->format(ATOM)' => $new->format( Carbon::ATOM ), //prints: 2017-01-01T23:47:21+00:00
'new->format(Y W)' => $new->format( 'Y W' ), //prints: 2017 52
] );
Еще один простой случай:
print_r( [
Carbon::create( 2017, 1, 1, 0, 0, 1 )->format( 'Y W' ), //prints: 2017 52
Carbon::create( 2016, 12, 31, 23, 59, 59 )->format( 'Y W' ), //prints: 2016 52
] );
1 ответ
Когда день наступает до 1-й недели в году (например, 1 января 2017 года), он возвращает 52, но не меняет фактический год (возвращает 2017 вместо 2016 года), поэтому я принудительно преобразую экземпляр в последний второй из предыдущего года, чтобы получить правильную неделю
if (50 < $new->weekOfYear && 2 > $new->month)
{
$new->year( $new->year - 1 )->endOfYear();
}
echo $new->format( 'Y W' ); //prints: 2016 52