一年中第一天PHP中的年/周组合无效

时间:2017-04-26 07:23:49

标签: php datetime timezone php-carbon

为什么会发生这种情况(可能导致Carbon扩展DateTimehttp://php.net/manual/es/datetime.format.php#114366)以及如何在更改时区时从Carbon实例获取正确的一周?< / p>

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 个答案:

答案 0 :(得分:0)

当一天在一年中的第一周之前,(例如:2017年1月1日) 它返回52,但不会改变实际年份(2017年而不是2016年),所以我强迫实例到上一年的最后一秒才能得到正确的一周

if (50 < $new->weekOfYear && 2 > $new->month)
{
    $new->year( $new->year - 1 )->endOfYear();
}

echo $new->format( 'Y  W' ); //prints: 2016  52