2017-04-26 74 views
0

为什么会发生这种情况的第一天(可能是原因Carbon扩展DateTime这​​),以及如何从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 
]); 
+0

那么,那些当地时间有一个1小时的偏移量。从00:47转换得到前一天的23:47 **。你期待什么结果? –

+0

事实证明,这是问题的日期,而不是时区本身。当日期更改为当年第一个星期一之前的一天时,则“weekOfYear”字段会更改,但不会更改实际的“年份”。我已经发布了一个答案。 – Azder

回答

0

当这一天是一年中的第一个星期之前,(例如: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 
+0

由于[docs](http://php.net/manual/en/function.date.php)解释,'W'是\t ISO-8601周数。这*不是*你的挂历行号,我怀疑你的期望。 –

+0

我期待正确的W是52,我没想到今年会保持到2017年......当只用'W'格式化时你看不出什么问题,但是在1月1日结合'YW'时,它会变成它到'2017 52' - 我没有想到。我需要它是'2016 52'。 – Azder

+0

感谢您的输入,我改变了标题,以免误导他人。 – Azder