DateTime 2018和2019周算PHP错误?

时间:2016-10-19 09:07:57

标签: php datetime

想要在一年内获得最长的一周,并认为这是获得这个数字最简单的方法,但我很惊讶,一年的最后一天可能是在第一周。这是因为这些日子是在本周的上半周吗? 所以我知道如何获得正确的数字,我只是想知道逻辑。

<?php
echo (new DateTime('2016-12-31 00:00:00'))->format('W'); //52

echo (new DateTime('2017-12-31 00:00:00'))->format('W'); //52

echo (new DateTime('2018-12-31 00:00:00'))->format('W'); //01
echo (new DateTime('2018-12-30 00:00:00'))->format('W'); //52

echo (new DateTime('2019-12-31 00:00:00'))->format('W'); //01
echo (new DateTime('2019-12-30 00:00:00'))->format('W'); //01
echo (new DateTime('2019-12-29 00:00:00'))->format('W'); //52

echo (new DateTime('2020-12-31 00:00:00'))->format('W'); //53

通过回答链接(维基百科)找到:

  

上周

     

ISO周编号年的最后一周,即第52或第53周   一,是01周前的一周。本周的属性是:

     

今年是最后一个星期四。

     

这是最后一周的大部分时间(4次或更多次)   腊。

     

它的中间一天,星期四,在结束的一年。

     

最后一天是最接近12月31日的星期日。

     

它有12月28日。因此,最新的可能日期是28   12月至1月3日,最早的12月21日至28日。

     

如果12月31日是星期一,星期二或星期三,则是在01周   第二年。如果是在星期四,则是在一年中的第53周   刚结束;如果在星期五,它是在第52周(如果是一年,则为53)   结束是闰年);如果在周六或周日,则是在第52周   刚刚结束的那一年

2 个答案:

答案 0 :(得分:3)

可能跟随the ISO week date system。引用维基百科的文章:

  

第01周的ISO 8601定义是其中第一个星期四的一周。

答案 1 :(得分:1)

如果你想获得一年中的最后一周,你可以使用这个简单的功能:

In [397]: a = np.array([2,3,2,1,0]) # Biasing array

In [398]: b = np.array([1,2,3,2,1])

In [399]: np.minimum(b[:,None],a)
Out[399]: 
array([[1, 1, 1, 1, 0],
       [2, 2, 2, 1, 0],
       [2, 3, 2, 1, 0],
       [2, 2, 2, 1, 0],
       [1, 1, 1, 1, 0]])